Unity3D :优化绘制调用

推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生

优化绘制调用

要在屏幕上绘制几何图形,Unity 会发出对图形 API 的绘制调用。绘制调用告诉图形 API 要绘制的内容以及如何绘制它。每个绘制调用都包含图形 API 需要在屏幕上绘制的所有信息,例如有关纹理、着色器和缓冲区的信息。绘制调用可能占用大量资源,但绘制调用的准备工作通常比绘制调用本身更占用资源。

为了准备绘制调用,CPU 会在 GPU 上设置资源并更改内部设置。这些设置统称为呈现状态。对渲染状态的更改(例如切换到其他材质)是图形 API 执行的资源密集型操作。

由于呈现状态更改会占用大量资源,因此对其进行优化非常重要。优化渲染状态更改的主要方法是减少它们的数量。有两种方法可以执行此操作:

  • 减少绘制调用的总数。减少绘制调用的数量时,也会减少它们之间的渲染状态更改的数量。
  • 以减少对呈现状态的更改次数的方式组织绘制调用。如果图形 API 可以使用相同的呈现状态来执行多个绘制调用,则可以将绘制调用组合在一起,而无需执行尽可能多的渲染状态更改。

优化绘制调用和呈现状态更改对应用程序有很多好处。主要是,它改善了帧时间,但它也:

  • 减少应用所需的电量。对于电池供电的设备,这会降低电池耗尽的速率。它还减少了设备在运行应用程序时产生的热量。
  • 提高了应用程序未来开发的可维护性。如果您更早地优化绘制调用和渲染状态更改并将其维护在优化级别,则可以向场景添加更多游戏对象,而不会产生较大的性能开销。

您可以在 Unity 中使用多种方法来优化和减少绘制调用和渲染状态更改。有些方法比其他方法更适合某些场景。Unity 中提供了以下方法:

  • GPU 实例化:同时渲染同一网格的多个副本。GPU 实例化可用于绘制场景中多次出现的几何图形,例如树木或灌木丛。
  • 绘制调用批处理:合并网格以减少绘制调用。Unity 提供以下类型的内置绘制调用批处理:
  • 静态批处理:提前组合静态游戏对象的网格。Unity 将组合数据发送到 GPU,但单独渲染组合中的每个网格。Unity 仍然可以单独剔除网格,但每次绘制调用的资源密集度较低,因为数据状态永远不会改变。
  • 动态批处理:转换 CPU 上的网格顶点,对共享相同配置的顶点进行分组,并在一次绘制调用中呈现它们。如果顶点存储相同数量和类型的属性,则它们将共享相同的配置。例如,和 .positionnormal
  • 手动组合网格:使用 Mesh.CombineMesh 函数手动将多个网格合并为单个网格。Unity 在单个绘制调用中渲染组合网格,而不是每个网格一个绘制调用。
  • SRP 批处理器:如果您的项目使用可编程渲染管线 (SRP),请使用 SRP 批处理器来减少 Unity 为使用相同着色器变体的材质准备和调度绘制调用所需的 CPU 时间。

优化优先级

您可以在同一场景中使用多种绘制调用优化方法,但请注意,Unity 会按特定顺序确定绘制调用优化方法的优先级。如果将游戏对象标记为使用多个绘制调用优化方法,Unity 将使用优先级最高的方法。唯一的例外是SRP配料机。使用 SRP 批处理器时,Unity 还支持对与 SRP 批处理器兼容的游戏对象进行静态批处理。Unity 按以下顺序确定绘制调用优化的优先级:

  1. SRP 配料机和静态配料
  2. GPU 实例化
  3. 动态批处理

如果将游戏对象标记为静态批处理,并且 Unity 成功对其进行批处理,Unity 将禁用该游戏对象的 GPU 实例化,即使渲染器使用实例化着色器也是如此。发生这种情况时,“检查器”窗口将显示一条警告消息,建议您禁用静态批处理。同样,如果 Unity 可以对网格使用 GPU 实例化,Unity 将禁用该网格的动态批处理。

3D建模学习工作室整理翻译,转载请注明出处!

上一篇:Unity3D :图形性能基础知识 (mvrlink.com)

下一篇:Unity3D :GPU 实例化 (mvrlink.com)

NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号