找回密码
 立即注册
查看: 256|回复: 0

[译]Unity合批失败的原因整理

[复制链接]
发表于 2023-1-4 05:41 | 显示全部楼层 |阅读模式

前文中介绍了批处理,批处理是一次性批量处理的意思。在前文中,如果渲染顺序出现问题批处理就会失败。本文将整理一些批处理失败的案例和解决办法分享给大家。
1. 若渲染顺序不正确,合批会失败



为了使Static Batching(静态批处理)、Dynamic Batching(动态批处理)、GPU Instancing 和 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解决。
本文仅限于学习参考交流,请勿做商业用途和随意转载。
Qinfei
2023/1/2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 02:39 , Processed in 0.111571 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表