Unity3D :图形性能基础知识

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

图形性能基础知识

本页包含一些优化应用程序中呈现性能的简单准则。

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

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

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

降低渲染的 CPU 成本

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

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

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

降低渲染的 GPU 成本

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

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

  • 识别并减少应用程序中的过度绘制。过度绘制最常见的因素是重叠的透明元素,例如 UI、粒子和精灵。在 Unity 编辑器中,使用“过度绘制”模式确定存在此问题的区域。
  • 降低片段着色器的执行成本。有关着色器性能的信息,请参阅着色器性能页面。
  • 如果您使用的是 Unity 的内置着色器,请从“移动”“无光照”类别中选择着色器。它们也适用于非移动平台,但是是更复杂的着色器的简化和近似版本。
  • 动态分辨率是一项 Unity 功能,可用于动态缩放单个渲染目标。

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

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

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

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

降低渲染频率

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

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

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

为了防止输入滞后,您可以在输入期间暂时提高渲染帧速率,使其仍然具有响应感。

要调整渲染帧速率,请使用按需渲染 API。该 API 与自适应性能包配合得特别好。

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


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

上一篇:Unity3D :OpenGL Core (mvrlink.com)

下一篇:Unity3D :优化绘制调用 (mvrlink.com)

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