合批

请明月發表於2024-10-18

靜態合批

一般合批的物件是場景中不能動的物體,靜態物體,並且在inspector介面勾選上static選項;Unity預先組合靜態GameObjects的網格,然後將組合的資料傳送到GPU,但單獨渲染組合中的每個網格,靜態合批不會減小drawcall,只是減少了渲染狀態的改變次數。Unity仍然可以單獨篩選網格,但每次繪製呼叫都不會佔用大量資源,因為資料的狀態永遠不會改變。在Unity開啟Static Batching,依次點選 Edit > Project Settings > Playe->Other Settings->enable Static Batching。對於Unity使用靜態合批的具體要求可以參照官方文件

支援靜態合批的Unity渲染管線:預設渲染管線、URP(通用渲染管線)、HDRP、SRP。

在執行時,透過指令碼使用靜態合批:Unity提供了執行時,透過指令碼使用靜態合批口:StaticBatchingUtility.Combine,這是一個靜態方法,透過這種方式呼叫靜態合批,就不需要在編輯器的inspector介面勾選上Static選項。

static Batching缺點與限制:使用靜態合批會增加記憶體!,因為使用靜態合批,需要在記憶體中儲存合成的幾何體資料;如果多個GameObject使用了相同的網格資料,Unity會為每一個GameObject建立一個網格副本,這就意味著相同的幾個資料有可能會出現多次!所以如果記憶體過大,就儘量避免使用靜態合批。對於每一次靜態合批,頂點數的限制時64000,如果超過這個值,Unity就會再次建立另外一個批次(Batch)。

動態合批

動態合併在滿足以下條件時時自動完成:

  1. 模型總頂點屬性數小於 900。例如,材質的shader使用了位置、法線、UV座標,那麼頂點數就是900 / 3 = 300,如果使用了vertex position, vertex normal, UV0, UV1, 和 vertex tangent,那麼頂點數量的限制就是 900 / 5 = 180;
  2. 不包含映象 transform 改變。 不改變 Scale。
  3. 如果使用動態 lightmap 需要指定正確。
  4. 不使用多 Pass 的 Shader。
  5. 不修改材質球
    由於需要在合併時透過 CPU 計算轉為世界座標,這項技術只在 CPU 消耗比 DrawCall 消耗“便宜”時才值得。這個衡量標準會根據平臺產生差異,例如蘋果平臺上 DrawCAll的消耗便宜,就不應該使用這項技術。這個功能可以在 Editor–> Project Setting –>Player 中進行設定開啟與關閉。

相關文章