减少 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(用户界面)允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 词汇表、粒子以及精灵一个 2D 图形对象。如果您习惯于在 3D 中工作,精灵本质上只是标准纹理,但有一些特殊的技术可以有效地组合和管理精灵纹理,以便在开发过程中提高效率和便利性。 更多信息
参见 词汇表。在 Unity 编辑器中,使用过度绘制绘制模式来识别出现问题的地方。
- 降低片段着色器的执行成本。有关着色器在 GPU 上运行的程序。 更多信息
参见 词汇表性能的信息,请参见着色器性能页面。
- 如果您使用的是 Unity 的内置着色器,请选择移动或未照明类别中的着色器。它们也适用于非移动平台,但它们是更复杂着色器的简化和近似版本。
- 动态分辨率一个相机设置,允许您动态调整单个渲染目标的大小以减少 GPU 上的工作量。 更多信息
参见 词汇表是 Unity 的一项功能,允许您动态调整单个渲染目标的大小。
如果应用程序受到内存带宽的限制,则 GPU 正在尝试比它在一帧中能够处理的更多数据读写到其专用内存。这通常意味着纹理过多或太大。如果是这种情况,请考虑以下选项
- 为在运行时与相机的距离发生变化的纹理启用mipmap(例如,3D 场景中使用的大多数纹理)。这会增加这些纹理的内存使用量和存储空间,但可以提高运行时 GPU 性能。
- 使用合适的压缩格式来减少内存中纹理的大小。这会导致更快的加载时间、更小的内存占用量以及更高的 GPU 渲染性能。压缩纹理仅使用未压缩纹理所需内存带宽的一小部分。
如果应用程序受到顶点处理的限制,这意味着 GPU 正在尝试处理比它在一帧中能够处理的更多顶点。如果是这种情况,请考虑以下选项
- 降低顶点着色器在渲染 3D 模型时,在模型的每个顶点上运行的程序。 更多信息
参见 词汇表的执行成本。有关着色器性能的信息,请参见着色器性能页面。
- 优化您的几何体:不要使用超过必要的三角形,并尽量使 UV 映射接缝和硬边(重复的顶点)的数量尽可能少。有关更多信息,请参见创建用于最佳性能的模型。
- 使用细节层次细节层次 (LOD) 技术是一种优化方法,它减少了当游戏对象与摄像头的距离增加时 Unity 必须渲染的游戏对象的三角形数量。 更多信息
参见 词汇表系统。
降低渲染频率
有时,降低渲染帧率对您的应用程序有利。这不会降低渲染单帧的 CPU 或 GPU 成本,但它会降低 Unity 执行渲染的频率,而不会影响其他操作(例如脚本执行)的频率。
您可以降低应用程序部分或整个应用程序的渲染帧率。降低渲染帧率可以防止不必要的功耗,延长电池寿命,并防止设备温度上升到可能导致 CPU 频率降低的程度。这在手持设备上特别有用。
如果分析表明渲染消耗了您的应用程序的很大一部分资源,请考虑哪些部分可能从这种方法中受益。常见的用例包括菜单或暂停屏幕、回合制游戏(游戏正在等待输入)以及内容主要为静态的应用程序(例如汽车 UI)。
为了防止输入延迟,您可以在输入期间暂时提高渲染帧率,使其仍然具有响应能力。
要调整渲染帧率,请使用 OnDemandRendering API。该 API 与 自适应性能包 协同使用效果尤其显著。
注意: VR虚拟现实 更多信息
参见 术语表 应用不支持按需渲染。不渲染每一帧会导致画面与头部移动不同步,并可能增加晕动症的风险。
更多资源