文章出處

【風宇沖】Unity3D性能優化:DrawCall優化

 (2013-03-05 15:39:27)
標簽: 

it

 

unity

 

unity3d

 

unity3d教程

分類: 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個。
(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
 

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()