动态批处理
动态批处理是一种绘制调用批处理方法,用于批处理移动的 GameObjects 以减少绘制调用。动态批处理在处理网格和 Unity 在运行时动态生成的几何体(如粒子系统)时有所不同。有关网格和动态几何体之间的内部差异的信息,请参阅网格的动态批处理和动态生成几何体的动态批处理。
注意:网格的动态批处理是为了优化旧低端设备的性能而设计的。在现代消费硬件上,动态批处理在 CPU 上的工作量可能超过绘制调用的开销,这会对性能产生负面影响。有关更多信息,请参阅网格的动态批处理。
要求和兼容性
该部分包含有关动态批处理的渲染管线兼容性的信息。
渲染管线兼容性
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义可编程渲染管线 (SRP) |
---|---|---|---|---|
动态批处理 | 是 | 是 | 否 | 是 |
使用动态批处理
Unity 始终对动态几何体(如粒子系统)使用动态批处理。
要对网格使用动态批处理:
- 转到 Edit > Project Settings > Player。
- 在 Other Settings 中启用 Dynamic Batching。
Unity 会自动将符合常见使用信息中描述条件的移动网格批处理为同一个绘制调用。
网格的动态批处理
网格的动态批处理通过将所有顶点转换为世界空间在 CPU 上执行,而不是在 GPU 上。这意味着只有在变换工作所需资源低于执行绘制调用时,动态批处理才是优化。
绘制调用的资源需求依赖于许多因素,主要是图形 API。例如,在控制台或现代 API(如 Apple Metal)上,绘制调用的开销通常较低,动态批处理往往不会提高性能。要确定在你的应用中使用动态批处理是否有利,建议在启用和禁用动态批处理的情况下对应用进行性能分析。
Unity 可以对阴影投射器使用动态批处理,即使它们的材质不同,只要 Unity 需要的阴影传递材质值相同。例如,多个箱子可以使用具有不同纹理的材质。尽管材质资产不同,但对阴影投射器传递的差异无关紧要,Unity 可以在阴影渲染步骤中批处理箱子 GameObjects 的阴影。
限制
在以下场景中,Unity 无法使用动态批处理,或只能在有限程度上应用动态批处理:
- Unity 不能对包含超过 900 个顶点属性和 300 个顶点的网格应用动态批处理。这是因为网格的动态批处理对每个顶点有开销。例如,如果你的着色器使用顶点位置、顶点法线和单个 UV,则 Unity 最多可以批处理 300 个顶点。但如果你的着色器使用顶点位置、顶点法线、UV0、UV1 和顶点切线,则 Unity 只能批处理 180 个顶点。
- Unity 不能对在其 Transform 组件中包含镜像的 GameObjects 应用动态批处理。例如,如果一个 GameObject 的缩放为 1,另一个 GameObject 的缩放为 -1,Unity 不能将它们批处理在一起。
- 如果 GameObjects 使用不同的材质实例,Unity 不能将它们批处理在一起,即使它们本质上相同。唯一的例外是阴影投射器渲染。
- 使用光照贴图的 GameObjects 具有额外的渲染参数。这意味着如果你希望批处理光照贴图的 GameObjects,它们必须指向相同的光照贴图位置。
- 对于使用多通道着色器的 GameObjects,Unity 不能完全应用动态批处理。
- 几乎所有 Unity 着色器在前向渲染中支持多个灯光。为了实现这一点,它们为每个灯光处理额外的渲染通道。Unity 只批处理第一个渲染通道,不能批处理额外的逐像素灯光的绘制调用。
- 传统延迟渲染路径不支持动态批处理,因为它在两个渲染通道中绘制 GameObjects。第一个通道是光照预通道,第二个通道渲染 GameObjects。
动态生成几何体的动态批处理
以下渲染器动态生成几何体,例如粒子和线条,可以使用动态批处理进行优化:
- 内置粒子系统
- 线条渲染器
- 路径渲染器
动态生成几何体的动态批处理与网格的动态批处理工作方式不同:
- 对于每个渲染器,Unity 将所有可以动态批处理的内容构建为一个大的顶点缓冲区。
- 渲染器设置批次的材质状态。
- 然后 Unity 将顶点缓冲区绑定到 GPU。
- 对于批次中的每个渲染器,Unity 更新顶点缓冲区中的偏移并提交新的绘制调用。
这种方法类似于 Unity 为静态批处理提交绘制调用的方式。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » unity动态批处理
发表评论 取消回复