Unity3D效能優化 DrawCall優化

2021-07-05 22:17:54 字數 2974 閱讀 9465

drawcall優化

一 mesh renderer

二 skinned mesh renderer

三 合併要求對比

四 總結

五 場景製作建議

drawcall優化合併,即drawcall batching. 通過減少draw call數 和對顯示卡效能的消耗來提高效能。

一 mesh renderer

分為dynamic batching和 static batching

dynamic batching

不需要任何操作,只要共享材質(即使是不同的mesh模型也可以),就會自動被合併。可以自由移動旋轉。但有以下使用要求:

(1) 

模型檔案共計點數不超過900。(重複使用同乙個mesh不計)

(2) 單個物體可以不超過300點,shader可以有法線uv。

但如果shader使用了 uv0 uv1兩套uv,或者tangent切線的話,單個物體只能不超過180點

(3)遊戲物件使用相同模型和材質時,只有相同縮放(即xyz等比縮放,浮點尾數可以有細微差)的會被合併。 如

(1,1,1)與(1,1,1)

(2,2,2)與(2,2,2)

(0.5,0.5,0.5)與 (0.5,0.5,0.5)

(2,2,2)與(2,2,2.0001)

(4)場景烘焙:烘焙後同材質將不會被烘焙。lightmap 有隱藏的材質引數:offset/scale, 所以使用lightmap的物體不會被合併

(5)shader不能使用多pass:多pass的shader會破壞dynamic batching

static batching

原理:執行遊戲後將一組遊戲物件的多個模型會被動態合併為1個。這組遊戲物件所有使用同一材質的在乙個drawcall來完成。這些遊戲物件執行後

無法移動縮放旋轉。但是drawcall一定是最大化合併的,並且不受動態合併的諸多限制(見下文詳述)。

注意:即使物體都使用了同樣的模型,在batch後每乙個物體都會建立乙份模型對應的geometry,在新的combined mesh裡。所以過多的batch會增加記憶體占用。例如場景裡的樹群就不適合static batch,而適合動態合併。

實現方法:

(1)meshrenderer勾選batching static: 勾了即可

(2)**中使用unityengine.staticbatchingutility實現(可以在任何平台呼叫):

1)將所有要合併的靜態物體(不須勾batching static)放入統一乙個root

2)staticbatchingutility.combine(root);

之後就合併好了!

區別:勾選batching static:

完全自動合併,在meshfilter裡顯示的是 combined mesh(root:scene)。合併後不能移動

staticbatchingutility:

合併到乙個遊戲物件下。合併後可以移動父節點遊戲物件

二 skinned mesh renderer

沒有任何batching, 故不是人物的話盡量少用。

注意:

(1)修改renderer.material將會建立乙份新的material,應使用renderer.sharedmaterial來保持材質公用。

(2)可以使用mesh.optimize() 

優化模型。匯入模型不需要呼叫此介面,在匯入模型至unity3d時已自動處理。

**建立的模型有可能需要呼叫此介面來優化。

三 合併要求對比

要求動態

靜態1 只能是meshrenderer不能是skinnedmeshrenderer

要求要求

2 shader必須是單pass

要求不要求

3 不能被場景烘焙(不能標註為light map static)

要求不要求

4 網格模型檔案總點數要求

要求不要求

5 網格模型單個檔案點數要求

要求不要求

6 限制縮放

要求不要求

7 限制位移旋轉

不要求要求

四 總結

三種方式:

1 動態合併

優點:記憶體消耗小

可以自由位移旋轉

缺點:要求眾多()

2 標記light map static合併

優點:最方便快捷,要求最少

缺點:完全不能移動

記憶體有消耗

只能處理在scene中預設放置的物體

3 **staticbatchingutility合併

優點:

方便快捷,要求少

可整體移動

可處理**動態載入的場景或物體

缺點:記憶體有消耗

**合併是要求最少的,並可以整體移動。而動態合併可以移動旋轉,並做animation動畫。故推薦staticbatchingutility + 動態合併。

五 場景製作建議

美術人員在製作某場景時,盡量:

靜態物體:使用靜態合併

條件 1 用mesh renderer,也就是不繫結骨骼

2 不是wrap迴圈uv的貼圖,盡量合併到一張大圖集

方法 標註batching static即可

動態物體:使用動態合併,動畫可以用unity的動畫去做

條件 1 無骨骼

2 不參與場景烘焙

3 相同物體相同縮放

4  模型點數小於300或180

5 模型檔案總點數小於900

6 shader單pass

方法 滿足條件unity自動優化

(不滿足動態合併要求的。場景動畫可以用骨骼動畫去做。但應盡量避免或者少的使用這種方式。因為沒有drawcall優化效率較低)

Unity3D 效能優化

unity3d 效能優化 一 程式方面 01 務必刪除指令碼中為空或不需要的預設方法 02 只在乙個指令碼中使用ongui方法 03 避免在ongui中對變數 方法進行更新 賦值,輸出變數建議在update內 04 同一指令碼中頻繁使用的變數建議宣告其為全域性變數,指令碼之間頻繁呼叫的變數或方法建議...

Unity3D效能優化總結

一 程式方面 01 務必刪除指令碼中為空或不需要的預設方法 02 只在乙個指令碼中使用ongui方法 03 避免在ongui中對變數 方法進行更新 賦值,輸出變數建議在update內 04 同一指令碼中頻繁使用的變數建議宣告其為全域性變數,指令碼之間頻繁呼叫的變數或方法建議宣告為全域性靜態變數或方法...

Unity 3D 效能優化總結

記憶體優化篇 cpu優化篇 unity中的優化技術 unity 3d ugui效能優化 unity 3d 優化記憶體 unity 3d mipmap unity 3d lod unity 3d 遊戲開發紋理壓縮方案 其他 效能優化 不要去頻繁getcomponent,獲取一次以後快取起來 優先使用a...