关注

为什么baches(draw calls)数那么高? 它们有什么意义?

问题

  • 我绘制了大量物体导致游戏运行缓慢
  • 我发现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的信息请查阅官方文档

更多信息

更多资料请参阅以下链接:

本文适用于Unity 5.x版本

 

这篇文章有帮助吗?
0 人中有 0 人觉得有帮助
还有其它问题?提交请求

0 评论

登录写评论。