问题
- 我在某些网格(Mesh)上调用了Combine,但它们并没按照期望的成为批处理。
- 我在编辑器中把网格做了静态批处理,但是没有看到它们被批处理。
原因
导致您的网格无法被批处理可能有以下原因:
- 您试图组合的网格中存在与其他网格材质不同的网格。
- 在检视面板窗口中,存在没有被标记为静态的游戏对象。
- 组合的游戏对象上不存在网格实例。
- 批处理中的任一网格的渲染器是空或者禁用。
- 对象已经被组合到其他网格批处理上了。
- 存在使用了DisableBatching(禁用批处理)标签的材质着色器。
- 网格的顶点计数为零。
- 批次内的顶点的数量超过64000这个最大值。Unity仅处理64k或者更少的顶点的批次,例如128001(64000x2 + 1)个顶点将会创建3个批次。
解决方案
检查您的项目中是否存在上述问题。如果没有则按照如下步骤进行问题排查:
- 确保您在评估静态批处理时处于播放模式,静态批处理的工作机制是在构建或者运行时使用StaticBatchingUtility.Combine组合网格。
- 有可能您遇到了程序错误,我们之前也有过在不该分割批次的时候分割批次的错误。如果不是之前描述的那些问题,那么请备份您的项目并在新版本的Unity中试试。
- 在某些罕见情况下使用不同烘培光贴图的网格不会在一个批处理中,一般情况下这不会发生,因为光照贴图会用某种形式的封装来避免这种问题。某些情况下,使用多种不同的网格时,因为单独的细节层级可能有不同的光照贴图,这可能不会将不同的LOD放入同一个批处理中。
- 如果您仍然遇到静态批处理问题,请打开 Unity Frame Debugger(在播放模式中),并查看网格的每个单独的绘画调用。查看不同材质和渲染通道绘制调用的发生并尝试找到其不同之处。例如查看您期望在一个批处理中的两个网格,每个都是否通过不同的渲染通道?是否其中一个有光照贴图而另一个没有?
更多信息
更多信息请参阅下方链接:
-
http://answers.unity3d.com/questions/961906/problem-with-draw-calls.html
-
http://forum.unity3d.com/threads/draw-calls-vs-batches-optimization-unity-5.318704/
- https://support.unity3d.com/hc/en-us/articles/207535646-Some-of-my-static-batching-is-being-split-into-separate-batches
本文适用于Unity 5.x。