
本文属Unity项目优化技巧系列第二篇。你可以用它们指导用更少的资源运行更高的帧率。尝试了这些最佳实践后,请务必查看系列的其他页面:
请参阅我们为 Unity 6 开发者和美术师提供的最新优化指南:
Unity 的图形工具让您能够在各种平台(从移动端到高端游戏主机和桌面)上创建任何风格的优化图形。这个过程通常取决于你的美术方向和渲染管线,所以开始之前,我们建议你查看可用的渲染管线。
优化场景光照并不是一门精确的科学,而是一个迭代的过程。它涉及试错,其过程通常取决于美术指导和渲染管线。
在开始照亮场景之前,您需要选择一条可用的渲染管线。渲染管线执行一系列操作,将场景内容显示在屏幕上。
Unity 提供三个预先构建的具有不同功能和性能特征的渲染管线,或者,您也可以创建自己的管线。
1. 通用渲染管线是预先构建的可编程渲染管线(SRP)。URP 提供美术师友好的工作流程,可在从移动设备到高端游戏主机和 PC 的各种平台上创建优化的图形。URP 是内置渲染管线的继任者,提供旧管线无法提供的图形和渲染功能。为了保持性能,它权衡了降低光照和着色的计算成本。如果您想覆盖大多数目标平台,包括移动和 VR,请选择 URP。
在电子书《高级Unity创作者通用渲染管线简介》(Unity 6版)中全面了解URP的能力。
2. 高清渲染管线(HDRP)是另一个预先构建的SRP, 专为先进的高保真图形而设计。HDRP 专为 PC、Xbox 和 PlayStation 等高端硬件设计,我们推荐使用该渲染管线来创建具有最高逼真度、具有高级光照、反射和阴影的逼真图形。HDRP 使用基于物理的光照和材质,并支持改进的调试工具。
在电子书《高清渲染管线中的光照和环境》中全面了解HDRP的功能。
3. 内置渲染管线是Unity较旧的通用渲染管线,可定制性有限。这一管线将在整个 Unity 6.x 周期中得到继续支持。

在前向渲染中,显卡会投射几何体并将其拆分成顶点。这些顶点被进一步分解成片段或像素,渲染到屏幕以生成最终图像。
管线会一次一个对象地传递到图形 API。前向渲染需要为每束光支付一定的费用。场景中的光照越多,渲染时间就越长。
内置管线的前向渲染器在每个对象上以单独的通道绘制每束光。如果有多个光照照射到同一游戏对象上,可能会导致明显的过度绘制,重叠区域需要多次绘制相同的像素。尽量减少实时光照的数量以减少过度绘制。
URP不是渲染每束光一次,而是为每个对象剔除光。这样一来,光照就可以一次性计算,与内置渲染管线的前向渲染器相比,绘制调用更少。
转发 +
Forward+ 渲染通过剔除空间光照而不是每个对象来改进标准 Forward 渲染。这会增加渲染一帧时可用的光源总数。在延迟渲染中,它支持本机 RenderPass API,允许将 G 缓冲区和光照通道合并到单个渲染通道中。

在延迟着色中,光照不会按对象计算。
相反,延迟着色会将光照计算推迟到以后阶段。延迟着色使用两个通道。
在第一次通道或G-Buffer几何体通道中,Unity渲染游戏对象。该传递检索多种类型的几何属性并将其存储在一组纹理中。G缓冲区纹理可以包括:
在第二个通道或光照通道中,Unity根据G缓冲区渲染场景的光照。想象一下,在每个像素上迭代,并根据缓冲区而不是单个对象计算光照信息。因此,在延迟着色中添加更多非阴影投射光源不会带来与前向渲染相同的性能冲击。
虽然选择渲染路径本身并不算优化,但它会影响项目的优化方式。本节的其他技术和工作流程可能有所不同,具体取决于您所选择的渲染管线和渲染路径。

HDRP和URP都支持Shader Graph,这是一种用于创建着色器的可视化界面。部分用户甚至能创造出原本遥不可及的复杂着色效果。使用可视化图形系统中的 150 多个节点创建更多着色器。您还可以使用 API 制作自己的自定义节点。
每个Shader Graph都带有一个兼容的主节点,节点决定了图的输出。使用可视化界面添加节点和运算符,并构建着色器逻辑。
然后,该 Shader Graph 传递到渲染管线的后端。最终生成的ShaderLab着色器在功能上类似于用HLSL或Cg编写的着色器。
优化 Shader Graph 遵循许多适用于传统 HLSL/Cg 着色器的规则。Shader Graph 处理得越多,对应用程序的性能影响就越大。
如果CPU占用过多,优化着色器不会提高权重,但仍能延长移动平台的电池寿命。
如果GPU密集型,请遵循以下指南来提高Shader Graphs的性能:
- 抽取节点:删除未使用的节点。请勿更改任何默认值或连接节点,除非这些更改是必要的。Shader Graph 会自动编译出所有未使用的功能。只要可能,将值烘焙到纹理中。比如,纹理的亮度不宜使用节点来加亮,而应应用在纹理资源上。
- 使用更小的数据格式:尽可能切换到更小的数据结构。在不影响项目的情况下,请考虑使用 Vector2 而不是 Vector3。如果条件允许,你也可以降低精度(比如用半精度代替float)。
- 减少数学运算:着色器运算每秒会运行很多次,因此请尽可能优化任何数学运算符。尝试混合结果,而不是创建逻辑分支。先使用常量,组合标量值,然后再应用向量。最后,将检视器中不需要显示的任何属性转换率。所有这些增量加速都有助于你的帧预算。
- 分支预览:随着图变大,编译速度可能会变慢。使用一个单独的更小的分支来简化工作流程,该分支仅包含您当前要预览的操作,然后对该小分支进行更快的迭代,直到实现预期的结果。
如果分支未连接到主节点,你可以放心地在图中留下预览分支。Unity 会在编译期间删除不影响最终输出的节点。
- 手动优化:即使你是一名经验丰富的图形程序员,你仍然可以使用Shader Graph为基于脚本的着色器编写样板代码。选择 Shader Graph 资源,然后从上下文菜单中选择 Copy Shader。
新建一个HLSL/Cg Shader,粘贴进复制好的Shader Graph。这是一种单向操作,但您可以通过手动优化获得更高的性能。

从 Graphics Settings (Edit > ProjectSettings > Graphics)的 Always Included 着色器列表中移除所有不使用的着色器。在此处添加应用程序生命周期所需的着色器。

着色器变体对于平台特定功能很有用,但会增加构建时间和文件大小。
您可以使用着色器编译指令以不同方式编译目标平台的着色器。然后使用着色器关键字(或Shader Graph关键字节点)创建启用了或禁用某些功能的着色器变体。
如果知道不需要着色器变体,可以阻止它们包含在构建中。
在Editor.log中分析着色器的时间和大小。找到以“Compiled shader”和“Compressed shader”开头的行。在示例日志中,TEST着色器会显示:
31.23秒的编译着色器"TEST Standard (Specular setup ) "
d3d9(内部程序总数:482,唯一:474)
d3d11(内部程序总数:482,唯一:466)
metal(内部程序总数:482,唯一:480)
glcore(内部计划总数:482,唯一:454)
d3d9 上的压缩着色器 'TEST Standard (Specular setup ) ' (1.04MB 到 0.14MB)
d3d11上的压缩着色器"TEST Standard (Specular setup ) " 范围为1.39MB到0.12MB
金属上的压缩着色器"TEST Standard (Specular setup ) " 从 2.56MB 到 0.20MB
glcore 上的压缩着色器 'TEST Standard (Specular setup ) ' 从 2.04MB 到 0.15MB
下面我们来了解下这个着色器的几个特点:
- 由于#pragma multi_compile和shader_feature,着色器可扩展为482种变体。
- Unity将游戏数据中包含的着色器压缩成大约压缩大小的总和:0.14+0.12+0.20+0.15 = 0.61MB.
- 在运行时,Unity将压缩数据保存在内存中(0.61MB),而当前使用的图形API的数据是未压缩的。例如,如果您当前的 API 是 Metal,则其容量将达到 2.56MB。
在构建之后,Project Auditor 可以解析 Editor.log 以显示编译到项目中的所有着色器、着色器关键字和着色器变体的列表。它还可以在游戏运行后分析 Player.log。这会显示应用程序在运行时实际编译和使用的变体。
利用这些信息构建可编程着色器剥离系统并减少变体数量。这可以改善构建时间、构建大小和运行时内存使用量。
请在Stripping scriptable shader variants博文中详细了解这一过程。
抗锯齿有助于平滑图像、减少锯齿边缘并最大限度地减少镜面锯齿。
如果要将前向渲染与内置渲染管线一起使用,可在Quality设置中使用Multisample Anti-aliasing (MSAA)。MSAA 可生成高质量的抗锯齿,但成本高昂。下拉菜单(None、2X、4X、8X)中的MSAA Sample Count确定了渲染器用于评估效果的样本数。
如果要将前向渲染与URP或HDRP一起使用,可以在Render Pipeline Asset上启用MSAA。
或者,也可以添加抗锯齿作为后处理效果。这在Camera组件的Anti-aliasing下出现:
- 快速近似抗锯齿 (FXAA) 平滑每像素级别的边缘。这是一种占用资源最少的抗锯齿方法,可使最终图像略微模糊。
- 亚像素形态抗锯齿(SMAA)根据图像边界混合像素。这比 FXAA 的效果要锐利得多,适用于平面、卡通或简洁的艺术风格。
在HDRP中 , FXAA和SMAA也可以与摄像机的Post Anti-aliasing设置结合使用URP 和 HDRP 还提供了另一个选项:
- 时间抗锯齿 (TAA) 使用历史缓冲区中的帧平滑边缘。这比FXAA更有效,但需要有运动矢量才能工作。TAA 还可以改善环境光遮挡和体积光。它的质量一般比FXAA高,但消耗的资源更多,并且偶尔会产生伪影。

时空后处理 (STP) 旨在提高移动、游戏主机和 PC 等广泛平台的视觉质量。STP 是一种时空抗锯齿升频器,可与 HDRP 和 URP 渲染管线配合使用,无需更改现有内容即可提供高质量的内容缩放。该解决方案针对 GPU 性能进行了特别优化,可确保更快的渲染时间,并更容易实现高性能,同时保持视觉质量。
要在URP中启用STP,请执行以下操作:
- 在 Project 窗口中选择活动的 URP Asset。
- 在检视器中,导航到 Quality > Upscaling Filter 并选择 Spatial-Temporal Post-Processing。

创建光照的最快方法是不需要逐帧计算的。为此,我们可以使用光照贴图来“烘焙”静态光照一次,而不是实时计算。
使用全局光照 (GI) 为静态几何体添加戏剧性光照。用 Contribute GI 标记对象,以便以光照贴图的形式存储高质量光照。
生成光照贴图环境的过程比在 Unity 中仅在场景中放置光源要长,但这:
- 运行速度更快,每像素两束光照快2-3倍
- 看起来更好 – GI 可以计算逼真的直接和间接光照。光照贴图器对生成的贴图进行平滑和降噪。
烘焙后的阴影和光照可以渲染,而不必再受到实时光照和阴影的性能冲击。
复杂的场景可能需要很长的烘焙时间。如果您的硬件支持渐进GPU光照贴图,此选项可以显著加快光照贴图生成速度,在某些情况下高达十倍。
按照本指南开始使用Unity的Lightmapping。

Reflection Probe组件可以创建逼真的反射,但在批处理时这可能会消耗大量性能。使用低分辨率立方体贴图、剔除遮罩和纹理压缩来提高运行时性能。使用类型:烘焙以避免每帧更新。
如果使用类型:实时性在URP中非常必要,尽量避免使用Every Frame(每帧)。调整刷新模式和时间片设置来降低更新权重。您还可以使用 Via Scripting 选项控制刷新,并使用自定义脚本渲染探针。
如果使用类型:实时技术在HDRP中是必须的,请使用广告需求/广告主模式。你也可以在Project Settings > HDRP Default Settings中修改Frame Settings。降低实时反射下的质量和功能,以提高性能。
降低实时反射下的质量和功能,以提高性能。

Unity 6 引入了自适应探针体积 (APV),为在 Unity 中处理全局光照提供了完善的解决方案,允许在复杂的场景中实现动态和高效的光照。APV 可以优化性能和视觉质量,尤其是在移动和低端设备上,同时为高端平台提供高级功能。
APV 提供了一系列增强全局光照的功能,尤其是在动态和大型场景中。URP现在支持逐顶点采样,可改善低端设备的性能,VFX粒子则受益于探针体积内的间接光照。
APV 数据可以从磁盘流传输到 CPU 和 GPU,从而优化大型环境的光照信息。开发者可以烘焙和混合多种光照场景,允许昼夜循环等实时过渡。该系统还支持天空遮挡,与Ray Intersector API集成以实现更高效的探针计算,并提供对光照探针样本密度的控制以减少光泄漏并加快迭代。新的C#烘焙API还支持从光照贴图或反射探针独立烘焙APV。
若想开始使用APV,请在GDC 2023演讲“Adaptive Probe Volumes with GDC 2023”中了解高效、高效的光照。

每个MeshRenderer和光照都可以禁用阴影投射。尽可能禁用阴影,以减少绘制调用。
您还可以使用模糊纹理在角色下方的简单网格或四边形上创建伪阴影。或者,你也可以用自定义着色器创建模糊阴影。
特别是不要为点光源启用阴影。每个有阴影的点光源每束光源需要六次阴影贴图通道 - ⁇ 与聚光灯的单个阴影贴图通道进行比较。如果绝对需要动态阴影,请考虑用聚光灯代替点光源。为了避免动态阴影,我们可以将立方体贴图与点光源一起用作 Light.cookie。

有时,你可以用些简单的技巧,不必再添加额外的光照。例如,不使用着色器来模拟轮廓光照,而是创建直接照射到摄像机中的光源,从而提供轮廓光照效果(请参阅表面着色器示例来了解在 HLSL 中的实现方式 ) 。
对于包含许多光源的复杂场景,请使用图层分离对象,然后将每个光源的影响限制为特定的剔除遮罩。

GPU光照贴图已在Unity 6中可用于生产环境。它利用 GPU 大大加快了光照数据的生成,与传统 CPU 光照贴图相比,烘焙时间显著缩短。它引入了新的光源烘焙后端,简化了代码库并提供更可预测的结果。此外,最低 GPU 要求已降至 2GB,并且还包含用于在运行时移动光照探针位置的新 API,这对于程序生成的内容特别有用,同时还进行了各种日常使用的改进。


您可以从 Unity 最佳实践中心找到更多面向高级 Unity 开发者和创作者的最佳实践和技巧。从 30 多份由行业专家、Unity 工程师和技术美术师编写的指南中进行选择,这些指南将帮助您高效使用 Unity 的工具集和系统。