Unity3D :可编程渲染管线批处理器

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
可编程渲染管线批处理器
可编程渲染管线 (SRP) 批处理器是一种绘制调用优化,可显著提高使用 SRP 的应用程序的性能。SRP 批处理器减少了 Unity 为使用相同着色器变体的材质准备和调度绘制调用所需的 CPU 时间。

要求和兼容性
本部分包含有关 SRP 批处理器的渲染管线兼容性的信息。
渲染管线兼容性
功能 | 内置渲染管线 | 通用渲染管线 (URP) | 高清渲染管线 (HDRP) | 自定义可编程渲染管线 (SRP) |
---|---|---|---|---|
SRP 配料机 | 否 | 是 | 是 | 是 |
游戏对象兼容性
在任何给定的场景中,有些游戏对象与 SRP 批处理器兼容,有些则不兼容。兼容的游戏对象使用 SRP 批处理器代码路径,不兼容的游戏对象使用标准 SRP 代码路径。有关详细信息,请参阅 SRP 批处理器的工作原理。
游戏对象必须满足以下要求才能与 SRP 批处理器代码路径兼容:
- 游戏对象必须包含网格或蒙皮网格。它不可能是粒子。
- 游戏对象不得使用 MaterialPropertyBlocks。
- 游戏对象使用的着色器必须与 SRP 批处理器兼容。有关详细信息,请参阅着色器兼容性。
着色器兼容性
高清渲染管线 (HDRP) 和通用渲染管线 (URP) 中的所有光照和不光照着色器都符合此要求(这些着色器的粒子版本除外)。
要使自定义着色器与 SRP 批处理器兼容,它必须满足以下要求:
- 着色器必须在名为 的单个常量缓冲区中声明所有内置引擎属性。例如,或 。
UnityPerDrawunity_ObjectToWorldunity_SHAr
- 着色器必须在名为 的单个常量缓冲区中声明所有材质属性。
UnityPerMaterial
您可以在“检查器”面板中检查着色器的兼容性状态。

使用 SRP Batcher
本节包含有关如何在 Unity 预构建的可编程渲染管线中使用 SRP 批处理器的信息。
在 URP 中使用 SRP 批处理器
要在 URP 中激活 SRP Batcher,请执行以下操作:
- 在“项目”窗口中,选择 URP 资源。
- 在 URP 资产的检查器中,启用 SRP 批处理器。如果此选项不可见,请按照以下有关如何显示 URP 资产的其他属性的说明进行操作。
如何显示 URP 资产的其他属性
默认情况下,Unity 不会在 URP 资源中显示某些高级属性。要查看所有可用属性,请执行以下操作:
在 URP 资产的任意部分中,单击垂直省略号图标 (⋮),然后选择显示其他属性

Unity 在当前部分中显示所有可用属性。
要在所有部分中显示所有其他属性,请执行以下操作:
- 单击垂直省略号图标,然后选择显示所有其他属性。Unity 在“首选项”窗口中打开“核心渲染管线”部分。
在“可见性>附加属性”属性中,选择“全部可见”。

在 HDRP 中使用 SRP 批处理器
使用 HDRP 时,Unity 默认启用 SRP 批处理器。不建议禁用 SRP 批处理器。但是,您可以暂时禁用 SRP 批处理器以进行调试。
要在构建时使用编辑器启用和禁用 SRP 批处理器,请执行以下操作:
- 在 Project 窗口中选择 HDRP 资源。
- 在资产的检查器中,进入调试模式。在调试模式下,您可以看到 HDRP 资源的属性,包括 SRP 批处理器属性。
- 选择启用 SRP 批处理器以启用或禁用 SRP 批处理器。
若要在运行时启用或禁用 SRP 批处理器,请在 C# 代码中切换以下全局变量:
GraphicsSettings.useScriptableRenderPipelineBatching = true;
SRP Batcher 的工作原理
优化绘制调用的传统方法是减少绘制调用的数量。相反,SRP 批处理器减少了绘制调用之间的渲染状态更改。为此,SRP 批处理器结合了一系列 GPU 命令。每个命令序列称为 SRP 批处理。binddraw

为了达到渲染的最佳性能,每个 SRP 批处理应包含尽可能多的命令。为此,请使用尽可能少的着色器变体。您仍然可以根据需要通过相同的着色器使用任意数量的不同材质。binddraw
当 Unity 在渲染循环期间检测到新材质时,CPU 会收集所有属性并将其绑定到常量缓冲区中的 GPU。GPU 缓冲区的数量取决于着色器声明其常量缓冲区的方式。
SRP 批处理器是一个低级渲染循环,它使材质数据保留在 GPU 内存中。如果材质内容未更改,则 SRP 批处理器不会进行任何渲染状态更改。相反,SRP 批处理器使用专用代码路径来更新大型 GPU 缓冲区中的 Unity 引擎属性,如下所示:

在这里,CPU 仅处理 Unity 引擎属性,在上图中标记为“每个对象”大缓冲区。所有材质在 GPU 内存中都有持久常量缓冲区,随时可用。这加快了渲染速度,因为:
- 现在,所有材质内容都保留在 GPU 内存中。
- 专用代码管理所有每个对象属性的大型每对象 GPU 常量缓冲区。
有意删除游戏对象的 SRP 批处理器兼容性
在极少数情况下,您可能希望有意使特定游戏对象与 SRP 批处理器不兼容。例如,如果要使用 GPU 实例化,这与 SRP 批处理器不兼容。如果要使用完全相同的材质渲染许多相同的网格,GPU 实例化可能比 SRP 批处理器更有效。要使用 GPU 实例化,您必须:
- 使用 Graphics.DrawMeshInstanced。
- 手动删除 SRP 批处理器兼容性并为材料启用 GPU 实例化。
有两种方法可以从游戏对象中删除与 SRP 批处理器的兼容性:
- 使着色器不兼容。
- 使渲染器不兼容。
提示:如果使用 GPU 实例化而不是 SRP 批处理器,请使用性能分析器确保 GPU 实例化对于您的应用程序比 SRP 批处理器更有效。
删除着色器兼容性
您可以使手写着色器和着色器图着色器与 SRP 批处理器不兼容。但是,对于着色器图着色器,如果您经常更改并重新编译着色器图,则使渲染器不兼容会更简单。
要使 Unity 着色器与 SRP 批处理器不兼容,您需要对着色器源文件进行更改:
- 对于手写着色器,请打开着色器源文件。对于着色器图着色器,请将着色器图的编译着色器源代码复制到新的着色器源文件中。在应用程序中使用新的着色器源文件,而不是着色器图。
- 将新的材质属性声明添加到着色器的块中。不要在常量缓冲区中声明新材料属性。
PropertiesUnityPerMaterial
材料属性不需要执行任何操作;仅具有常量缓冲区中不存在的材质属性,就会使着色器与 SRP 批处理器不兼容。UnityPerMaterial
警告:如果使用着色器图,请注意,每次编辑和重新编译着色器图时,都必须重复此过程。
删除渲染器兼容性
您可以使单个渲染器与 SRP 批处理器不兼容。为此,请向渲染器添加 a。MaterialPropertyBlock
在 Unity 帧调试器中分析 SRP 批处理器
您可以在帧调试器窗口中检查 SRP 批处理的状态。每个 SRP 批处理显示 Unity 使用了多少个绘制调用、Unity 附加到着色器的关键字,以及 Unity 未将该绘制调用与前一个绘制调用批处理的原因。
要检查 SRP Batcher 批次的状态,请执行以下操作:
- 在编辑器中,打开帧调试器(菜单:“>分析窗口”>“帧调试器”)。
- 在帧调试器中,转到渲染相机>渲染不透明。
- 展开 RenderLoopNewBatcher.Draw 列表。
- 选择要检查的 SRP 批次。
在下面的示例中,原因是:节点具有不同的着色器。这意味着该 SRP 批处理的着色器与上一个 SRP 批处理中的着色器不同。由于 SRP 批处理器使用不同的着色器,因此 SRP 批处理器创建了一个新批处理。如果多个 SRP 批处理的绘制调用数量较少,这通常意味着项目使用了太多着色器变体。

如果您编写自己的可编程渲染管线,而不是使用通用渲染管线或高清渲染管线,请尝试使用最少数量的关键字编写通用多用途着色器。这是最佳的,因为您可以使用任意数量的材料属性。
由3D建模学习工作室整理翻译,转载请注明出处!