Unity中的动态合批使用整理

Unity 动态批处理(Dynamic Batching)是 Unity 引擎提供的一种优化渲染性能的技术,可对移动的游戏对象进行批处理,从而减少 GPU 的渲染调用次数,提高渲染效率。

原理:

动态批处理的原理就是将多个具有相同材质(Material)且满足一定条件的网格合并为一个大的网格,然后只进行一次渲染调用,这样就可以显著减少渲染调用次数,提升性能。

开启批处理:

Unity 始终对动态几何体(如 Particle Systems)使用动态批处理。
手动开启:在Edit > Project Settings > PlayerOther Settings (其他设置) 中,将Dynamic Batching (动态批处理)勾选上即可。

兼容性:

功能 内置渲染管线 通用渲染管线 (URP) 高清渲染管线 (HDRP) 自定义可编程渲染管线 (SRP)
动态批处理

合批条件:

1.Unity 无法对包含超过 900 个顶点属性300 个顶点的网格应用动态批处理。这是因为网格的动态批处理每个顶点都有开销。
例如,如果着色器使用顶点位置、顶点法线和单个 UV,则 Unity 最多可以批处理 300 个顶点。但是,如果着色器使用顶点位置、顶点法线、UV0、UV1 和顶点切线,则 Unity 只能批处理 180 个顶点
2.如果游戏对象使用不同的材质实例,则无法批处理,即使它们本质上相同。唯一的例外阴影投射物渲染
3.具有光照贴图的游戏对象具有额外的渲染器参数。这意味着,如果要对光照贴图游戏对象进行批处理,它们必须指向相同的光照贴图位置
4.Unity 无法将动态批处理完全应用于使用多通道着色器的游戏对象
几乎所有 Unity 着色器都支持前向渲染,为了实现这一点,他们为每个光源处理一个额外的渲染通道。Unity 仅对第一个渲染通道进行批处理。它无法对其他每像素光源的绘制调用进行批处理。
Legacy Deferred(旧版延迟) 渲染路径不支持动态批处理,因为它在两个渲染通道中绘制游戏对象。第一个通道是轻量级预通道,第二个通道渲染游戏对象。
5.批处理使用信息

合批时机:

1.帧开始时检查:在每一帧渲染开始之前,Unity 会检查场景中所有的游戏对象,判断它们是否满足动态批处理的条件。如果满足条件,就会尝试将它们合并。
2.对象状态改变时:当游戏对象的状态发生改变(如位置、旋转、缩放等)时,Unity 会重新评估该对象是否可以参与动态批处理。如果状态改变后仍然满足条件,就会将其纳入合批范围;如果不满足条件,则会将其从批处理中移除。
3.材质属性更新时:如果游戏对象的材质属性(如颜色、纹理等)发生了更新,Unity 会检查更新后的材质是否与其他对象的材质一致,以及是否满足动态批处理的其他条件。如果满足,就会尝试重新进行合批。

动态生成的几何图形的动态批处理

以下渲染器会动态生成几何图形,例如粒子和线条:
内置粒子系统线渲染器轨迹渲染器

动态生成的几何体的动态批处理(与网格不同):
1.对于每个渲染器,Unity 会将所有动态可批处理的内容构建到一个大型顶点缓冲区中。
2.渲染器设置批处理的材质状态。
3.然后,Unity 将顶点缓冲区绑定到 GPU
4.对于批处理中的每个 Renderer,Unity 会更新顶点缓冲区中的偏移量并提交新的绘制调用

未完待续。。。

参考链接:

Unity - 手动:动态批处理 (unity3d.com)

动态批处理 - Unity 手册

猜你喜欢

转载自blog.csdn.net/weixin_50702814/article/details/146987040