Version: Unity 6.0 (6000.0)
语言 : 中文
图形性能和性能分析
配置文件渲染

减少 CPU 或 GPU 上的渲染工作

本页面包含一些用于在应用程序中优化渲染性能的简单指南。

准备工作:找到并了解问题

进行任何更改之前,必须对应用程序进行性能分析,以确定问题的原因。如果在还没了解原因就尝试解决性能问题,可能会浪费时间或使问题恶化。此外,与渲染相关的性能问题也可能发生在 CPU 或 GPU 上。解决这些问题的策略有很大不同,因此务必在采取任何行动之前了解问题所在。

Unity Learn 站点上的以下文章全面介绍了图形性能,并包含有关识别和修复问题的信息:修复性能问题。如果您还不熟悉此主题,请在遵循此页面上的任何建议之前阅读文章。

降低渲染的 CPU 开销

通常,CPU 渲染时间的最大影响因素是向 GPU 发送渲染命令的开销。渲染命令包括绘制调用(绘制几何体的命令)以及在绘制几何体之前更改 GPU 上设置的命令。如果是这种情况,请考虑以下选项:

  • 可以减少 Unity 渲染的对象数量。
    • 考虑减少场景中的对象总数:例如,使用天空盒来创建远处几何体的效果。
    • 执行更严格的剔除,以便 Unity 绘制更少的对象。请考虑使用遮挡剔除来防止 Unity 绘制隐藏在其他对象后面的对象,缩小摄像机的远裁剪面,使更远的对象落在视锥体之外,或者为了获得更细粒度的方法,将对象放入单独层,并使用 Camera.layerCullDistances 设置每层剔除距离。
  • 可以减少 Unity 渲染每个对象的次数。
    • 使用光照贴图在适当时“烘焙”(预计算)光照和阴影。这会增加构建时间、运行时内存使用量和存储空间,但可以提高运行时性能。
    • 如果应用程序使用前向渲染,请减少影响对象的每像素实时光源数量。有关更多信息,请参阅前向渲染路径
    • 实时阴影可能非常耗费资源,因此请谨慎有效地使用。有关更多信息,请参阅阴影故障排除:阴影性能
    • 如果您的应用程序使用反射探针,请确保优化它们的使用。有关更多信息,请参阅反射探针性能
  • 可以减少 Unity 为准备和发送渲染命令而必须完成的工作量,通常的做法是将它们以更有效的“批次”发送到 GPU。可通过几种不同方法实现此目的:有关更多信息,请参阅优化绘制调用

其中许多方法也会减少 GPU 上所需的工作;例如,减少 Unity 在一帧中渲染的对象总数,将减少 CPU 和 GPU 的工作负载。

降低渲染的 GPU 开销

GPU 可能无法及时完成工作以渲染帧的原因主要有三个。

如果应用程序受填充率限制,GPU 会尝试每帧绘制超出其处理能力的像素。如果是这种情况,请考虑以下选项:

  • 识别和减少应用程序中的过度绘制。导致过度绘制的最常见因素是透明元素重叠,例如__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
    See in Glossary
    、粒子和精灵。在 Unity 编辑器中,使用过度绘制模式可识别存在问题的区域。
  • 降低片元着色器的执行开销。有关着色器性能的更多详细信息,请参阅着色器性能页面。
  • 如果要使用 Unity 的内置着色器,请从__移动端 (Mobile)__ 或__无光照 (Unlit)__ 类别中选取。这些类别也适用于非移动平台,但它们是更复杂着色器的简化和近似版本。
  • 动态分辨率是 Unity 的一种功能,可以动态缩放单个渲染目标。

如果应用程序受内存带宽限制,GPU 会尝试在其专用内存中读写超出其一帧处理能力的数据。这通常意味着纹理太多或太大。如果是这种情况,请考虑以下选项:

  • 为与摄像机的距离在运行时变化的纹理启用 Mipmap(例如,3D 场景中使用的大多数纹理)。这会增加这些纹理的内存使用量和存储空间,但可以提高运行时 GPU 性能。
  • 使用合适的压缩格式可减小纹理在内存中的大小。这种做法可加快加载时间,减小内存占用,显著提高 GPU 渲染性能。与未压缩的纹理所需的内存带宽相比,压缩纹理使用的内存带宽要小得多。

如果应用程序受到顶点处理的限制,这意味着 GPU 试图处理的顶点数量超过其在一帧中能够处理的顶点数量。如果是这种情况,请考虑以下选项:

  • 降低顶点着色器的执行开销。有关着色器性能的更多详细信息,请参阅着色器性能页面。
  • 优化几何体:不要使用超出必要的三角形数量,并尽可能减少 UV 映射接缝和硬边(双倍顶点)的数量。如需更多信息,请参阅创建最佳性能模型
  • 使用细节级别系统。

降低渲染频率

有时,降低渲染帧率可能会有利于应用程序。这不会降低渲染单帧的 CPU 或 GPU 开销,但会降低 Unity 执行此操作的频率,而不会影响其他操作(例如脚本执行)的频率。

您可以降低部分应用程序或整个应用程序的渲染帧率。降低渲染帧率可防止不必要的功耗,延长电池续航时间,并防止设备温度升高到 CPU 频率可能被限制的程度。这在手持设备上特别有用。

如果性能分析显示渲染会占用应用程序相当大一部分的资源,请考虑应用程序的哪些部分可能会从中受益。常见的用例包括菜单或暂停屏幕,游戏正在等待输入的基于回合的游戏,以及内容大部分为静态的应用程序(例如汽车 UI)。

为了防止输入滞后,可以在输入持续时间内临时增加渲染帧率,使其仍然具有响应性。

要调整渲染帧率,请使用 OnDemandRendering API。API 与 Adaptive Performance Package 特别适合搭配使用。

注意:VR 应用程序不支持按需渲染 (On Demand Rendering)。如果不渲染每一帧,则会导致视觉效果与头部移动不同步,并可能增加晕动症的风险。

其他资源

图形性能和性能分析
配置文件渲染