UnityDrawCall優化

轉載地址:  http://blog.sina.com.cn/s/blog_471132920101gbfr.html 

轉載自風宇衝Unity3D教程學院

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優化效率較低)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章