提高性能(Improving Performance)

介绍

Unity是一个非常强大的平台,您可以达到比大多数传统工程工具高得多的仿真和可视化性能。但您仍然可能在具有1000万个以上三角形及以上的模型和场景中达到性能极限。Unity提供了许多改善的方法。我们在这里仅描述我们的经验和性能建议,但肯定还有很多其他方法可以提高性能。

快速概览

请始终遵循这些规则——按重要性排序

ℹ️

导入 CAD数据时使用尽可能低的网格质量。您应该始终优先考虑这一点——以后更改可能需要大量工作

您是否要创建可重用组件——导出后将它们作为 FBX 导出——或者它只是一次性的 CAD模型导入,您不需要创建预制体?

为所有不移动的对象设置 Gameobject 静态设置(static settings)

场景中使用不超过3个灯光

如果您是专家,将渲染管线更改为 URP(Universal Render Pipeline)(见下文)

在 CAD导入后,将导入的实例化材质替换为共享材质(shared Materials)(由所有网格共享的材质,您可以在 Assets 文件夹中找到)——您可以使用 MaterialWindow(仅在 Professional 版本中可用)或 SelectionWindow 来快速分配新材质。

使用 性能优化器(Performance Optimizer)(仅在 Professional 版本中可用)合并网格,将同一运动学层次结构中的网格或不移动的网格合并为一个网格

Gameobject 静态设置

ℹ️

这是一个非常重要且对性能影响很大的设置——您应该始终考虑这一点。

这是最重要的性能建议。您应该将所有不移动的对象(例如连接到 Drive 的对象)设置为 Static。

非移动 GameObject 上的静态设置

更改物理设置(Physics Settings)

您还可以更改物理设置,例如固定更新周期时间,以提高性能。更多信息可以在 物理 部分找到

简化网格

项目中总三角形数量也对性能有很大影响。您应该只导入需要的 CAD数据,并尽可能简化网格。在较小的项目中,您不需要关心这一点,因为 Unity有足够的性能来可视化大量网格。但如果您的项目超过100万个网格,并且遇到图形周期时间大于50毫秒的情况,您应该考虑改善网格的性能。

为了改善性能,请按照以下步骤操作。

导入

您应该在导入时使用足够好但在视觉上不需要太高的网格质量(例如使用 CADLink)。

使用 CADChecker 检查网格(仅限 Professional 版本)

使用 CADChecker,您可以分析您的网格,找到最大的网格(改进性能有意义的部分)并检测不必要的重复项。

您应该首先优化 MU(Movable Unit) 的网格和较大非静态移动对象的网格。

简化已导入的网格

如果您已经导入了 CAD数据并想简化单个网格,您可以使用第三方工具,例如 Mesh Simplify(参见 https://assetstore.unity.com/packages/tools/modeling/mesh-simplify-43658

灯光和阴影

光照和阴影在 Unity中创建沉浸式视觉体验方面起着关键作用,但它们也对性能有重大影响,特别是在仿真期间由非静态对象动态计算时。

在考虑性能优化时:

  • 减少灯光数量:Unity中的每个光源都会增加计算开销,因为每个光源会计算其对范围内对象的影响。通过最小化场景中活动灯光的数量,您可以减轻 CPU 和 GPU 的负担,从而改善整体性能。评估所有灯光是否必要,并考虑在可行的情况下组合多个灯光或使用烘焙光照。
  • 禁用阴影:光照投射的阴影增强真实感,但也可能计算成本高昂,特别是在为移动对象实时计算时。禁用光照的阴影可以显著减少 GPU 工作负载。如果视觉保真度允许,考虑关闭阴影或调整阴影设置以平衡视觉质量与性能。
  • 静态和烘焙光照:利用静态光照和烘焙阴影可以提供显著的性能优势。静态对象和环境可以预先计算光照和阴影,减少仿真期间的运行时计算。这种方法对于主要为静态元素且不需要实时光照计算的场景特别有效。
  • 优化光照设置:Unity提供了各种可以调整的光照设置和参数,以平衡视觉质量和性能。尝试光照强度、范围和衰减设置,以实现所需的视觉效果,同时最小化性能影响。

碰撞器(Colliders)

在 Unity中,碰撞器(Colliders)在决定对象如何在游戏世界中相互交互方面起着至关重要的作用。在考虑碰撞器时,使用 Box Colliders 和 Mesh Colliders 之间的选择可以显著影响性能。

Box Colliders 是简单的几何形状,使用轴对齐的包围盒来近似对象的边界。它们效率高,因为计算碰撞需要最小的计算资源。Box Colliders 非常适合形状简单的对象,如立方体或矩形棱柱,其中形状与碰撞器紧密匹配。

Mesh Colliders 则使用对象的实际网格几何体来定义碰撞边界。这为无法通过基本碰撞器(如盒子或球体)准确表示的复杂形状提供了精确的碰撞检测。但是,Mesh Colliders 在计算上更昂贵,因为它们需要详细的网格数据进行碰撞计算。这可能会影响性能,特别是在大量对象或复杂网格上使用时。

对 Unity性能的影响:

  • Box Colliders 轻量且高效,使其适合形状简单的对象。它们对性能开销的贡献最小,使其成为在精确碰撞检测不重要的场景中的首选。
  • Mesh Colliders 虽然为复杂形状提供了准确的碰撞检测,但可能由于处理基于详细网格数据的碰撞所需的计算资源而引入性能开销。广泛使用 Mesh Colliders 或在高多边形模型上使用可能导致 CPU 使用率增加和帧率降低,影响整体游戏性能。

最佳实践:

  • 尽可能对形状简单的对象使用 Box Colliders 以优化性能。
  • 仅当对于无法通过基本碰撞器近似的复杂几何体需要精确碰撞检测时才考虑使用 Mesh Colliders
  • 通过尽可能简化网格几何体来优化 Mesh Colliders,以减少计算负载而不牺牲碰撞精度。

将渲染管线更改为通用渲染管线(Universal Render Pipeline)

ℹ️

通用渲染管线(Universal Render Pipeline)比标准渲染管线稍微复杂一些。当您需要非常好的性能和非常好的视觉质量时应该使用它。

⚠️

请注意,此部分已过时。它解释了手动切换渲染管线的过程,您仍然可以这样做,但自版本 2022.11 起,您可以自动切换——更多信息请参阅 渲染管线 部分

我们的经验是,通过将项目更改为通用渲染管线(Universal Rendering Pipeline),您可以将性能提高约30%。但您应该仅在已经是 Unity专家并且确实需要额外性能时才这样做。

您应该按照以下步骤更改为通用渲染管线(Universal Rendering Pipeline)。更多信息请查看 Unity在线文档。

安装 URP(Universal Render Pipeline)

  • 打开 Package Manager 窗口(Window > Package Manager)。
  • 在 Package Manager 窗口中,在 Packages 字段中选择 Unity Registry。
  • 从包列表中选择 Universal RP。
  • 在 Package Manager 窗口的右下角,选择 Install。Unity将 URP(Universal Render Pipeline)安装到您的项目中。

创建通用渲染管线资源(Universal Render Pipeline Asset)

Universal Render Pipeline Asset 控制您项目的全局渲染和质量设置,并创建渲染管线实例。渲染管线实例包含中间资源和渲染管线实现。

要创建 Universal Render Pipeline Asset:

  • 在 Editor 中,转到 Project 窗口。
  • 在 Project 窗口中右键单击,选择 Create > Rendering > Universal Render Pipeline > Pipeline Asset。或者,导航到顶部的菜单栏,选择 Assets > Create > Rendering > Universal Render Pipeline > Pipeline Asset

您可以保留新 Universal Render Pipeline Asset 的默认名称,或者输入一个新名称。

将资源添加到 Graphics 设置

要使用 URP(Universal Render Pipeline),您需要将新创建的 Universal Render Pipeline Asset 添加到 Unity的 Graphics 设置中。如果不这样做,Unity仍会尝试使用内置渲染管线。

要将 Universal Render Pipeline Asset 添加到 Graphics 设置:

导航到 Edit > Project Settings… > Graphics

在 Scriptable Render Pipeline Settings 字段中,添加您之前创建的 Universal Render Pipeline Asset。当您添加 Universal Render Pipeline Asset 时,可用的 Graphics 设置会立即更改。您的项目现在使用 URP(Universal Render Pipeline)。

通用渲染管线着色器

升级您的着色器

您的项目使用内置渲染管线的着色器,而您希望将项目切换为使用通用渲染管线(Universal Render Pipeline),您必须将这些着色器转换为 URP(Universal Render Pipeline)着色器。

使用 SelctionWindow 在场景中更换为新渲染管线的着色器

在 Unity中打开您的项目,然后转到 Edit > Render Pipeline > Universal Render Pipeline。

根据您的需求,选择 Upgrade Project Materials to URP Materials 或 Upgrade Selected Materials to URP Materials。

如果升级后 Project View 中的预览缩略图不正确,请尝试在 Project View 窗口中的任意位置右键单击并选择 Reimport All。

更改场景中的着色器

您可能仍然在场景中看到粉色对象。这是因为场景中的材质可能仍然设置了标准着色器。

您需要将场景中的所有材质更改为新的 URP(Universal Render Pipeline)着色器,例如 Universal Render Pipeline/Lit

您可以手动执行此操作,但对于较大的模型,您可以使用 Selection Window 自动更改所有选定 Gameobject 的着色器。

Profiler

对于专家来说,Unity内置了 Profiler。可以测量所有帧并识别哪些函数占用了最多时间。Unity Profiler 通过 Window > Analysis > Profiler 启动

用于详细分析性能瓶颈的 Profiler

更多信息请参见 Unity关于 Profiler 的文档:

性能优化器(Performance Optimizer)(仅包含在 Professional 版本中)

性能优化器(Performance Optimizer)是一个可以添加到您导入的 CAD几何体上的组件。它将网格合并为具有多种材质的网格,以提高场景的运行时性能。在此过程中,原始网格将被设置为非活动状态。此合并网格可以保存为独立对象。然后,该对象也可以定义为静态以实现进一步的改进。您还可以定义要包含在合并网格中的运动学组。为进一步优化,您还可以删除由合并网格表示的网格。请注意,如果删除了网格,撤销功能不涵盖重建。

性能优化器

属性

Create sub object for mesh: 此选项将创建一个空的 game object 来存储合并的网格。

Create static mesh: 新创建的网格将是静态的。静态网格在运行时只计算一次。

Include non static elements: 合并的网格还将包括非静态网格。非静态网格属于在运行时可以移动或自行移动的对象。

Exclude groups: 具有 component group 的对象在合并中不被考虑。

Delete combined meshes: 用于合并网格的原始网格在合并后被删除。注意:此功能无法撤销。

Included groups for mesh optimizer: 在此列表中,您可以定义其网格可以被合并的组。

"Optimize Meshes" 按钮启动优化。"Undo mesh optimize" 按钮解散新创建的网格。