批次處理是Unity 對於Draw Call呼叫優化的功能,有三個種類的批次處理:
※另外Static batching 跟 GPU Instancing 不能共用,在Mesh Renderer上會顯示出警告訊息
3D物件要在引擎上渲染出來的話,就需要經過呼叫GPU去做一次渲染如設定shader -> 設定貼圖 -> 設定三角網格等等,這樣在引擎上的渲染的指令就是draw call,所以當你要渲染一張木椅或是一張鐵椅,因為材質不同所以會產生兩個draw call,所以才會製作過程中要求使用相同的材質跟相同的網格模型。
而Batch就是,Unity在像GPU發起一次Draw Call之前,先將shader、貼圖、網格先做一次處理,可以混再一起渲染的資訊就混在一起送出,而這些資訊再加上一個或多個繪製命令就稱為一次批次處理(a Batch)
提高圖形性能的另一個好辦法是使用GPU Instancing。GPU Instancing的最大優勢是可以減少內存使用和CPU開銷。當使用GPU Instancing時,不需要打開批處理,GPU Instancing的目的是一個網格可以與一系列附加參數一起被推送到GPU。要利用GPU Instancing,您必須使用相同的材質,且可以傳遞額外的參數到著色器,如顏色,浮點數等。
要讓場景中的物體使用Static Batching,需要將其標記為Static,並在Mesh Renderer中共享相同的材質,因為Static Batching不會在CPU上做頂點轉換,所以它通常比Dynamic Batching更有效。不過它會使用更多的內存,例如你的場景中有相同物體的多個副本,Unity會將它們組合成一個大網格並可能會增加內存使用。Unity將盡可能多的網格結合到一個靜態網格中,並將其作為一個Draw Call提交。這種方法的缺點是:標記為Static的物體在其生命週期中不能移動。
Dynamic Batching啟用時,Unity將嘗試自動批量移動物體到一個Draw Call中。要使物體可以被動態批處理,它們應該共享相同的材質,但是還有一些其他限制:
※另外需要注意,Dynamic Batching通過將所有物體的頂點轉換為CPU上的世界空間來工作,所以它只能在渲染Draw Call的工作量小於CPU頂點轉換工作量的時候,才會起到提高性能的作用。當用遊戲機或如Metal這樣的現代API,Draw Call的開銷通常低得多,Dynamic Batching就無法提高性能了。
Unity5.6 在Frame Debugger中新增了一項功能 ,能逐一確認這些批次處理的資訊
Window > Frame Debugger 來打開Frame Debugger
Frame Debugger 可以看到遊戲中所有的批次處理資訊,以及這些批次處理的所有細節資訊,包括著色器、貼圖及批次處理所用的大量資訊等。
Frame Debugger 內會告訴你,你的模型物件無法被批次運算的原因。
也有可能只是Project Setting中沒有打開這樣功能而已