Unity Drawcall、渲染順序、打包圖集、特效清理、代碼優化

什麼是DrawCall

drawcall是CPU對底層圖形繪製接口的調用命令GPU執行渲染操作,渲染流程採用流水線實現,CPU和GPU並行工作,它們之間通過命令緩衝區連接,CPU向其中發送渲染命令,GPU接收並執行對應的渲染命令。

DrawCall爲什麼會影響效率

如果DrawCall數量過多就會導致CPU進行大量計算,進而導致CPU的過載,影響遊戲運行效率。

DrawCall的優化

圖集、層級

所以並不是好多人的認知是隻要同一個圖集就會佔用同一個DrawCall,通過上圖分析發現不光是要使用同一個圖集,還要使用同樣的材質在同一個panel下才可以,否則就會重新進行調用一次DrawCall。另外需要注意的是,如果使用同一個圖集、材質,但是中間夾雜了其他的渲染狀態,也會導致重新調用一次DrawCall。

批處理

批處理從字面意思就是一塊處理多個物體的意思,但是是什麼樣的都可以進行批處理嗎?答案就是使用同一個材質的物體纔可以。unity中有個兩種批處理方式,動態批處理和靜態批處理。對於動態批處理來說,好處就是一切都是自動處理的,並且物體是可以移動的。
動態批處理限制:

  • 頂點屬性最大限制900,
  • 使用lightmap的物體不行進行批處理
  • 使用MultiplePass的shader也不會進行批處理
  • 接受實時陰影的物體也不會進行批處理
    對於靜態批處理來說,好處就是自由度很高,限制條件少,但是它會佔用更多的內存,並且經過批處理的物體不可以在進行移動。下面說下靜態批處理, 靜態批處理前提當然也是使用了同一個材質,然後就是講對應的對象設置爲static:
    這時你會發現DrallCall變爲1了,這就是靜態批處理的作用,但是這時候你會發現VBO Total比剛纔大了,這就是靜態批處理壞處,通過內存來換取性能,下面我們看下官方的解釋:

如果在靜態批處理前有一些物體共享了相同的網格(例如這裏的兩個箱子),那麼每一個物體都會有一個該網格的複製品,即一個網格會變成多個網格被髮送給GPU。在上面的例子看來,就是VBO的大小明顯增大了。如果這類使用同一網格的對象很多,那麼這就是一個問題了,這種時候我們可能需要避免使用靜態批處理,這意味着犧牲一定的渲染性能。例如,如果在一個使用了1000個重複樹模型的森林中使用靜態批處理,那麼結果就會產生1000倍的內存,這會造成嚴重的內存影響。

參考

https://blog.csdn.net/yu1368072332/article/details/85676537

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