Unity中的各種合批

JeasonBoy發表於2024-07-25

TODO

Batches:當前共有幾個批次
Save by baatching:因為當前的合批省了幾個批次

SetPass calls:當前有幾個Draw事件(類似Draw Call)

Tips:一個Frame Debug小知識,綠色那裡顯示當前有多少個draw事件,紅色表示,當前產生這個新draw call的原因,這裡就表示這個Mesh Cube_3使用了新材質,新加了一個dc

動態合批:
0.相同材質
1.Project Settings > Player > Other Settings 中確認 Dynamic Batching 是否被勾選
2.對於動態小物體(頂點數少於 300),Unity 會自動嘗試進行動態合批,無需在 Inspector 皮膚中進行特殊設定。
3.超過300頂點的物體,會單獨新建一個批次(所以很虧,比如剛好300個頂點,則可以106000/300=35個合一起,而301個的,35個就是35個batches)
4.帶有skin wieght的蒙皮屬性的mesh,即使小於300點,也無法合批
4.PC上,一個batches最多可以有106000面左右(估計是跟平臺有關,可能手機上就小點),超過就下一個batches,好像不是取決於頂點數?
缺點:因為是執行時動態計算的,所以對CPU開銷較大,當頂點數超過一定閾值時效果較差。

靜態合批:
0.相同材質
1.Project Settings > Player > Other Settings 中確認 Static Batching 是否被勾選
2.選中某個靜態物件,觀察 Inspector 皮膚中是否勾選了 Static。
3.只能在執行前設定static有用,執行時再設定不生效
4.skin wigeht的mesh也可也合批(不過好像沒啥意義,動畫動起來好像就會斷開合批?)
5.靜態合批的一個批次頂點數容量比動態的大得多,測試130K左右
注:實際一個批次最多能多少面,上面測的不準,因為是在原地複製複製的,模型都堆疊在一起,分散開後,雖然stats上面的總面數沒變化,但是batches明顯增多
缺點:佔用較多的執行時記憶體和包體大小,因為所有被合批的幾何體會合併為一個大網格。只適用於靜態物體

GPU例項化:
0.相同材質
1.材質勾選啟用gpu instancing
2.批次數量限制

注:一定條件下,gup例項化跟動態合批很相似,都是動態地把幾個相同材質的物體合成一個批次,至於哪個更節省效能,待研究


SRP合批:
要求:只適用於URP/HDRP,Shader 必須符合 SRP Batcher 的規則,如必須遵循特定的Uniform結構。
待研究


UI合批:
待研究

相關文章