问题
- 我绘制了大量物体导致游戏运行缓慢
- 我发现CPU消耗过大
原因
Unity调用图形API绘制游戏物体,这个过程会产生batches(或draw calls),场景中的所有物体都必须使用图形API绘制。场景中过多的物体会增加绘制过程性能消耗,同时能观测到很高的draw calls值。但真正导致问题的原因是:渲染器(renderer)绘制物体时必须处理不同的物体属性。假设场景中有很多物体,这些物体有着各不相同的材质(material),贴图(texture),着色器(shader)等等,渲染器为了绘制这些物体必须不停地切换渲染模式。
总结如下:
游戏物体使用了不同的材质或贴图。
游戏物体没有标记为静态(static 即使用Static Batching)。
解决方案
了解draw calls和batches的本质非常重要。一次draw call意味着调用一次图形API(绘制物体,例如绘制一个三角形);一个batch是一组draw call,即多个draw call打包交给图形API(节省性能开销)。
你可以把多个物体打包成batch来提升性能。使用batch的主要目的是减少绘制物体耗费的时间。Unity使用两种方法打包物体:动态批处理(Dynamic Batching)和静态批处理(Static Batching)。动态批处理要求多个物体具有相同属性,例如共用材质和贴图。静态批处理是最为推荐的方法,但以消耗更多内存作为代价。如需使用静态批处理,你需要将游戏物体标记为静态(static),即在检视窗口(Inspector)标记物体为static。Unity静态批处理的原理是将场景中静态物体的网格(mesh)进行组合,生成一个大的网格交给图形API绘制。动态批处理,顾名思义,即尽可能地为非静态(non-static)物体进行优化。
更多关于batch和draw call的信息请查阅官方文档。
更多信息
更多资料请参阅以下链接:
- http://forum.unity3d.com/threads/what-are-draw-calls.27416/
- http://answers.unity3d.com/questions/961906/problem-with-draw-calls.html
- http://answers.unity3d.com/questions/295503/draw-calls.html
- http://forum.unity3d.com/threads/draw-calls-vs-batches-optimization-unity-5.318704/
本文适用于Unity 5.x版本