Version: 6000.3
语言: 中文
图形性能和分析
收集渲染性能数据

减少 CPU 或 GPU 上的渲染工作

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

开始之前:找到并了解问题

在进行任何更改之前,必须分析应用程序以确定问题的原因。如果您在了解性能问题的原因之前尝试解决其原因,则可能会浪费时间或使问题变得更糟。此外,CPU 或 GPU 上可能会出现与渲染相关的性能问题。解决这些问题的策略大不相同,因此在采取任何行动之前了解问题出在哪里非常重要。

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

降低渲染的 CPU 成本

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

  • 您可以减少 Unity 渲染的对象数量。
    • 考虑减少场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在每个场景中,你放置你的环境、障碍物和装饰品,基本上是将你的游戏设计和构建成碎片。更多信息
      请参阅术语表
      :例如,使用天空盒(skybox) 一种特殊类型的材质,用于表示天空。通常是六面的。更多信息
      请参阅术语表
      以创建远几何体的效果。
    • 执行更严格的剔除,以便 Unity 绘制更少的对象。考虑使用遮挡剔除 禁用从摄像机视图中隐藏(遮挡)的游戏对象渲染的过程。更多信息
      请参阅术语表
      以防止 Unity 绘制隐藏在其他对象后面的对象,从而减少相机在场景中创建特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。更多信息
      请参阅术语表
      以便更远的对象落在其视锥体之外,或者,对于更细粒度的方法,将对象放入单独的层中,并使用 Camera.layerCullDistances 设置每层的剔除距离。
  • 您可以减少 Unity 渲染每个对象的次数。
    • 在适当的情况下使用光照贴图“烘焙”(预计算)光照和阴影。这会增加构建时间、运行时内存使用量和存储空间,但可以提高运行时性能。
    • 如果您的应用程序使用前向渲染一种渲染路径,用于在一个或多个通道中渲染每个对象,具体取决于影响对象的光源。光源本身也因前向渲染而异,具体取决于其设置和强度。更多信息
      请参阅术语表
      ,减少影响对象的每像素实时光源的数量。有关详细信息,请参阅前向呈现路径
    • 实时阴影可能非常占用资源,因此请谨慎高效地使用它们。有关详细信息,请参阅影子故障排除:影子性能
    • 如果您的应用程序使用反射探针(Reflection Probes一个渲染组件,可捕获周围环境的各个方向的球形视图,就像摄像机一样。然后,捕获的图像将存储为立方体贴图,可供具有反射材质的对象使用。更多信息
      请参阅术语表
      ,请确保优化其使用。有关更多信息,请参阅反射探针性能
  • 您可以减少 Unity 为准备和发送渲染命令而必须执行的工作量,通常是通过以更高效的“批处理”方式将它们发送到 GPU。有几种不同的方法可以实现此目的:有关详细信息,请参阅优化绘制调用

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

降低渲染的 GPU 成本

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

如果应用程序受填充率限制,则 GPU 会尝试绘制更多内容像素计算机图像中的最小单位。像素大小取决于您的屏幕分辨率。像素光照是在每个屏幕像素下计算的。更多信息
请参阅术语表
每帧超出其处理能力。如果是这种情况,请考虑以下选项:

  • 识别并减少应用程序中的过度绘制。过度绘制的最常见因素是重叠的透明元素,例如 UI、粒子和精灵2D 图形对象。如果你习惯于在3D中工作,精灵本质上只是标准纹理,但有一些特殊的技术可以组合和管理精灵纹理,以提高开发过程中的效率和便利性。更多信息
    请参阅术语表
    .在 Unity 编辑器中,使用 Overdraw Draw 模式来识别存在此问题的区域。
  • 降低片段着色器的执行成本。有关着色器在 GPU 上运行的程序。更多信息
    请参阅术语表
    性能,请参阅着色器性能页面。
  • 如果您使用的是 Unity 的内置着色器,请从 MobileUnlit 类别中选择一个。它们也适用于非移动平台,但是更复杂着色器的简化和近似版本。
  • 动态分辨率(Dynamic Resolution)摄像机设置,允许你动态缩放单个渲染目标,以减少GPU上的工作负载。更多信息
    请参阅术语表
    是 Unity 的一项功能,允许您动态缩放单个渲染目标。

如果应用程序受到内存带宽的限制,则 GPU 会尝试向其专用内存读取和写入比它在帧中处理的更多的数据。这通常意味着 或纹理太多,或者纹理太大。如果是这种情况,请考虑以下选项:

  • 为与相机的距离在运行时变化的纹理启用 mipmap(例如,3D 场景中使用的大多数纹理)。这会增加这些纹理的内存使用量和存储空间,但可以提高运行时GPU性能。
  • 使用合适的压缩格式来减小内存中纹理的大小。这可以缩短加载时间、减少内存占用并提高 GPU 渲染性能。压缩纹理仅使用未压缩纹理所需内存带宽的一小部分。

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

  • 降低执行成本顶点着色器 渲染模型时在 3D 模型的每个顶点上运行的程序。更多信息
    请参阅术语表
    .有关着色器性能的信息,请参阅着色器性能页。
  • 优化几何体:不要使用超过必要的三角形,并尽量减少 UV 贴图接缝和硬边(双顶点)的数量。有关更多信息,请参阅创建模型以获得最佳性能
  • 使用细节级别细节级别 (LOD ) 技术是一种优化,当游戏对象与相机的距离增加时,它减少了 Unity 必须为游戏对象渲染的三角形数量。更多信息
    请参阅术语表
    系统。

降低渲染频率

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

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

如果分析显示呈现消耗了应用程序的很大一部分资源,请考虑应用程序的哪些部分可能会从中受益。常见用例包括菜单或暂停屏幕、游戏等待输入的回合制游戏,以及内容大部分是静态的应用程序,例如汽车界面。

为防止输入延迟,您可以在输入持续时间内暂时提高渲染帧速率,以便它仍然感觉响应。

若要调整呈现帧速率,请使用 OnDemandRendering API。该 API 与 Adaptive Performance 包配合得特别好。

注意: VR虚拟现实 更多信息
术语表
应用程序不支持按需渲染。不渲染每一帧都会导致视觉效果与头部运动不同步,并可能增加晕车的风险。

其他资源

图形性能和分析
收集渲染性能数据