文章出處
文章列表
標簽:
itunityunity3dunity3d教程 |
分類: Unity3d之優化 |
原創文章如需轉載請注明:轉載自風宇沖Unity3D教程學院
DrawCall優化
一 Mesh Renderer
二 Skinned Mesh Renderer
三 合并要求對比
四 總結
五 場景制作建議
DrawCall優化合并,也叫批處理,即DrawCall Batching. 通過減少Draw call數提高性能。
一 Mesh Renderer
分為Dynamic Batching和 Static Batching
Dynamic Batching
不需要任何操作,只要共享材質(即使是不同的Mesh模型也可以),就會自動被合并。可以自由移動旋轉。但有以下使用要求:
(1)單個Mesh的vertex attribute總數不超過900.
即 vertex* attributeCount < 900
例如一個Mesh有pos,uv,normal,那么attributeCount為3,
也就是頂點數量不超過300個。
(1)單個Mesh的vertex attribute總數不超過900.
即 vertex* attributeCount < 900
例如一個Mesh有pos,uv,normal,那么attributeCount為3,
也就是頂點數量不超過300個。
(2)游戲對象使用相同模型和材質時,只有相同縮放(即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)
(3)場景烘焙:烘焙后同材質將不會被烘焙。lightmap 有隱藏的材質參數:offset/scale, 所以使用lightmap的物體不會被合并
(4)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
Unity對Skinned Mesh Renderer沒有任何batching, 但插件Mesh Baker可以對Skinned Mesh進行合并。
注意:
(1)修改Renderer.material將會創建一份新的material,應使用Renderer.sharedMaterial來保持材質公用。
(2)可以使用Mesh.Optimize() 優化模型。導入模型不需要調用此接口,在導入模型至Unity3d時已自動處理。
代碼創建的模型有可能需要調用此接口來優化。
三 合并要求對比
要求 | 動態 | 靜態 |
1 只能是MeshRenderer不能是SkinnedMeshRenderer | 要求 | 要求 |
2 Shader必須是單Pass | 要求 | 不要求 |
3 不能被場景烘焙(不能標注為Light map static) | 要求 | 不要求 |
4 網格模型文件總點數要求 | 要求 | 不要求 |
5 網格模型單個文件點數要求 | 要求 | 不要求 |
6 限制縮放 | 要求 | 不要求 |
7 限制位移旋轉 | 不要求 | 要求 |
另外Unity中任何Mesh的面 有65536的面數限制
四 總結
三種方式:
1 動態合并
優點:
內存消耗小
可以自由位移旋轉
缺點:
要求眾多()
2 標記Light map static合并
優點:
最方便快捷,要求最少
缺點:
完全不能移動
內存有消耗
只能處理在Scene中默認放置的物體
3 代碼StaticBatchingUtility合并
優點:
方便快捷,要求少
可整體移動
可處理代碼動態加載的場景或物體
缺點:
內存有消耗
代碼合并是要求最少的,并可以整體移動。而動態合并可以移動旋轉,并做Animation動畫。故推薦StaticBatchingUtility + 動態合并。
五 場景制作建議
美術人員在制作某場景時,盡量:
靜態物體:使用靜態合并
條件
1 用Mesh Renderer,也就是不綁定骨骼
2 不是Wrap循環UV的貼圖,盡量合并到一張大圖集
方法
標注Batching Static即可
動態物體:使用動態合并,動畫可以用Unity的動畫去做
條件
1 無骨骼
2 不參與場景烘焙
3 相同物體相同縮放
4 單個Mesh的vertex attribute總數不超過900.
5 Shader單Pass
方法
滿足條件Unity自動優化
(不滿足動態合并要求的。場景動畫可以用骨骼動畫去做。但應盡量避免或者少的使用這種方式。因為沒有Drawcall優化效率較低)
PS:
要關閉動態合并在subshader里加以下代碼即可
Tags { "DisableBatching" = "true" }
如果是非Mobile端可以考慮使用GPU Instancing
如果是有超級多的人,可考慮使用頂點動畫提高性能。
參考
Draw call batching
PS:
要關閉動態合并在subshader里加以下代碼即可
Tags { "DisableBatching" = "true" }
如果是非Mobile端可以考慮使用GPU Instancing
如果是有超級多的人,可考慮使用頂點動畫提高性能。
參考
Draw call batching
文章列表
全站熱搜