關於Draw Call

根據3W法則來說明Draw Call

 

What?(什麼是Draw Call)

 

Draw Call就是CPU調用圖形編程接口,比如DirectX或OpenGL,來命令GPU進行渲染的操作。

例如,DirectX中的DrawIndexedPrimitive命令,OpenGL中的glDrawElement命令。

也可以說成,在Unity中,每次引擎準備數據並通知GPU的過程稱爲一次Draw Call。

爲了CPU和GPU可以並行工作,就需要一個命令緩衝區(Command Buffer)

命令緩衝區包含了一個命令隊列,由CPU向其中添加命令,而由GPU從中讀取命令。添加和讀取的過程是相互獨立的,因此命令緩衝區可以使CPU和GPU相互獨立工作。當CPU需要渲染一些對象時,它可以向命令緩衝區添加命令,而GPU完成了上一次的渲染任務後,它就可以從命令隊列裏取出一個命令並執行它。

命令緩衝區中的命令有很多種類,而Draw Call是其中的一種。

 

Why?(爲什麼Draw Call會影響性能)

 

在調用Draw Call前CPU需要把很多數據準備好,物體的頂點(包括本地位置、法線、UV等),索引(頂點如何組成三角形),變換(就是物體的位置、旋轉、縮放、以及攝像機位置等),相關光源,紋理,渲染方式(由材質/Shader決定)等等數據。在這一階段,CPU需要完成很多工作,例如檢查渲染狀態等。而一旦CPU完成了這些準備工作,GPU就可以開始本次的渲染。GPU的渲染能力是很強的,渲染速度往往快於CPU提交命令的速度。如果Draw Call的數量太多,CPU就會把大量時間花費在提交Draw Call命令上,造成CPU的過載。因此造成Draw Call性能問題的元兇是CPU。調用Draw Call的次數是決定性能比較重要的指標。

 

 

How?(如何減少Draw Call的數量)


在Unity 中提供來Dynamic Batching和Static Batching技術

https://gameinstitute.qq.com/community/detail/113040

https://gameinstitute.qq.com/community/detail/114323

 

 

 

 

參考:https://www.jianshu.com/p/061b84e4f863

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章