原文链接
正文
前文中介绍了批处理,批处理是一次性批量处理的意思。在前文中,如果渲染顺序出现问题批处理就会失败。本文将整理一些批处理失败的案例和解决办法分享给大家。
1. 若渲染顺序不正确,合批会失败
为了使 Static Batching(静态批处理)、Dynamic Batching(动态批处理)、GPU Instancing 1 和 SRP Batcher 等批处理功能正常运行,合批物件的渲染顺序 也要绑定在一起。诸如 UI 或 Sprite 等 2D 物件,若渲染顺序没处理好,合批就会失败。
我准备上面两种 2D 图片 Atlas 样本。
当一张 Atlas 的两个图像按渲染顺序绑定时,批处理正常运行,但当在中间插入另一张 Atlas 的图像后 批处理被破坏。
但基于 UGUI,即使渲染顺序不正确,若不与其他 Atlas 图片重叠,批处理仍可正常处理。总而言之,若你要用 UGUI,应先设计一个 Atlas,考虑渲染顺序和图片是否重叠,以提高性能优化。(UI 字体也一样)
2. Static Batching 对象的顶点数据结构必须一样
以下问题仅出现在 Static Batching。(动态批处理、GPU Instancing、SRP Batcher 不适用)
图上示例是 1 个静态对象,用了 4 种网格和 1 种材质。但只有圆柱物件没有绑定到 Static Batching。
为什么会这样呢?主要因为网格的顶点数据结构不一致。在上图示例中,圆柱网格没有 UV1,但其他网格都有 UV1。
所以 解决办法 是,把 UV1 通道也加到圆柱网格,这样即可正常进行静态批处理。
结论,如果要用 Static Batching,批处理对象的顶点数据结构(含 UV 通道,法线,切线)得相同。
3. Reflection Probe(反射探针)会破坏Static Batching
如上图,我在部分静态批处理对象上放了反射探针。(SRP Batcher 已禁用)
在这种情况下,Static Batching 失败了,在 Frame Debugger 中可看到报错提示。这是因为 合批中物件受反射探针影响不同。
出现上述问题的 核心原因是 Set Pass Call 会因反射探针而变化。(就算 shader 不用 Reflection Probe 数据也一样)
所以,如果激活对 Set Pass Call 信息合批的 SRP Batcher,问题马上就能解决。
总结
- 要想顺利进行批处理,一定要处理好渲染顺序。
- Static Batching 不会合并 顶点数据结构 不同的网格。
- 反射探针 会影响 Static Batching,但可用
SRP Batcher解决。