您想找什么?
Hero background image
面向技术艺术家的移动优化技巧(第二部分)

您将从此页面获得什么: 我们收集的实用技巧的第二部分用于优化您的手机游戏的艺术资产。第一部分是这里

您可以在这本全面的电子书有关移动应用程序的 3D 艺术优化的Unity Learn课程中找到许多其他移动优化技巧

Unity 编辑器上的光照设置
组织您的游戏对象以利用这些批处理技术。
光照

通过 通用渲染管线 (URP),控制台和 PC 上的相同基于物理的照明和材质也可以扩展到您的手机或平板电脑上。

批量执行绘制调用

对于每一帧,Unity 都会确定必须渲染的对象,然后创建绘制调用。绘制调用是对图形 API 的调用,用于绘制对象(例如三角形),而批处理是一组一起执行的绘制调用。将要绘制的对象分批绘制 可以最大限度地减少批量绘制每个对象所需的状态变化。通过降低渲染对象的 CPU 成本,可以提高性能。

  • 动态批处理对于较小的网格,Unity 可以在 CPU 上对顶点进行分组和转换,然后一次性绘制它们。注意:仅当您拥有足够的低多边形网格(少于 900 个顶点属性且不超过 300 个顶点)时才使用此功能。动态批处理器不会对大于此值的网格进行批处理,因此启用它将浪费 CPU 时间来寻找在每一帧中要批处理的小网格。
  • 静态批处理:对于非移动几何体,Unity 可以减少共享相同材质的网格的绘制调用。虽然它比动态批处理更高效,但它占用更多内存。
  • GPU实例化来优化渲染。如果您拥有大量相同的对象,此技术可以通过使用图形硬件更有效地对它们进行批处理。

SRP 批处理:在“高级”下,启用 URP 资产中的 SRP Batcher。根据场景不同,这可以显著加快您的 CPU 渲染时间。

避免过多动态灯光

避免在移动应用程序中添加过多的动态灯光至关重要。考虑替代方案,例如动态网格的自定义着色器效果和光探测器,以及静态网格的烘焙照明。

请参阅此 功能比较表, 了解 URP 和内置渲染管道实时灯光的具体限制。

禁用阴影

每个 MeshRenderer 和光线都可以禁用阴影投射。尽可能禁用阴影以减少绘制调用。

您还可以使用应用于角色下方的简单网格或四边形的模糊纹理来创建假阴影。否则,您可以使用自定义着色器创建斑点阴影。

Unity Lightmap示意图
禁用阴影投射以减少绘制调用。
将光照烘焙到光照贴图中

使用 全局照明(GI)为静态几何体添加戏剧性的灯光。使用 Contribute GI 标记对象,以便您可以光照贴图的形式存储高质量的照明。

烘焙的阴影和灯光可以在运行时进行渲染,而不会影响性能。Progressive CPU 和 GPU Lightmapper 可以加速全局光照的烘焙。

按照 手册有关灯光优化的文章 开始在 Unity 中使用光照贴图。

Unity 编辑器中的多个光照层
图层可以将光线的影响限制在特定的剔除遮罩内。
使用浅色图层

对于具有多个光源的复杂场景,请使用图层分离对象,然后将每个光源的影响限制在特定的剔除遮罩内。

Unity 编辑器中的光探测器
使用光探测器来观察移动的物体

光照探测器存储有关场景中空白空间的烘焙照明信息,同时提供高质量照明(直接照明和间接照明)。他们使用球面谐波函数,与动态光相比,其计算速度更快。

反射球与立方体相交
尽量减少反射探针

反射探针 可以创建逼真的反射,但批次成本可能非常高。使用低分辨率立方体贴图、剔除遮罩和纹理压缩来提高运行时性能。

Unity 编辑器中的透明材质
场景视图中的过度绘制可视化模式
注意透明材料

渲染具有透明度的对象总是比渲染不透明对象使用更多的 GPU 资源,尤其是当透明对象多次叠加渲染时,这个过程称为过度绘制。尽可能使用不透明材料是一种很好的做法,尤其是对于移动平台。您可以使用 RenderDoc 图形调试器检查过度绘制。

保持着色器简单

尽可能使用最简单的着色器(例如无光着色器)并避免使用不必要的功能。使用 Unity 专为粒子等系统设计的预建着色器。URP 包含几个轻量级的 Lit 和 Unlit 着色器,它们已经针对移动平台进行了优化。为了最大限度地减少过度绘制,请减少游戏中粒子的数量和/或大小。

为了实现性能目标,请考虑在可能的情况下使用半精度的无光不透明材质,并注意节点中的复杂操作。在有关 Shader Graph 的 本次会话 中可以找到更多提示。

点亮 vs。无光照着色器

创建着色器时,您可以决定材质对光的反应。大多数着色器被分类为亮或不亮。无光着色器是速度最快且计算成本最低的着色模型。如果您的目标设备是低端设备,请使用它。

需要考虑的关键点包括:

  • 照明不会影响未照明的着色模型。这意味着不需要进行许多计算,例如镜面反射计算。结果是渲染成本更低或速度更快。
  • 使用类似于卡通的风格化艺术指导可以很好地与无光阴影配合使用。当你为移动平台开发游戏时,这种风格值得考虑。
Unity 编辑器中的着色器图形
SHADER GRAPH中的顶点位移
顶点着色器中的数学运算

顶点着色器在每个顶点上工作,而像素(或片段)着色器在每个像素上运行。通常,渲染的像素数量比屏幕上的顶点数量多。这意味着像素着色器比顶点着色器运行得更频繁。因此,我们建议您尽可能将计算从像素着色器移至顶点着色器。与往常一样,在完成优化工作后,您必须进行进一步的分析以确定适合您特定情况的最佳解决方案。

加法和乘法等基本运算处理速度更快。最好使较慢的数学运算的数量尽可能少。在旧设备(例如使用 GLES 2.0 的设备)上,所使用的复杂数学运算量必须较低。

SRP配料器

启用 SRP Batcher 时,请在 Profiler 视图中观察统计信息窗口和渲染部分的顶点图。除了 FPS 有所提升之外,处理的三角形和顶点的数量也急剧减少。由于我们的对象使用与 URP 兼容的着色器,因此渲染管道会自动批处理所有相关的几何数据,以减少处理的数据量。

角色动画

默认情况下,Unity 使用 Generic Rig 导入动画模型,但开发人员在为角色制作动画时经常切换到 Humanoid Rig。人形装备比同等的通用装备多消耗 30–50% 的 CPU 时间,因为它要计算每帧的逆运动学和动画重定向。

渲染 蒙皮网格的开销 很大。确保每个使用 SkinnedMeshRenderer 的对象都需要它。如果 GameObject 仅在某些时候需要动画,请使用 BakeMesh 函数将蒙皮网格冻结在静态姿势中,然后在运行时切换到更简单的 MeshRenderer。

Unity 的 Mecanim 系统主要用于人形角色,相当复杂,但通常用于为单个值设置动画(例如,UI 元素的 alpha 通道)。避免过度使用动画师。特别是与 UI 元素结合时,考虑创建补间函数或使用第三方库进行简单的动画(例如,DOTween 或 LeanTween)。

Unity 编辑器中的室内灯光场景
使用帧调试器工具检查绘制调用、批处理和渲染周期的每个步骤
更多技巧

每帧都有特定的时间预算

每帧都会根据你的目标每秒帧数(fps)有一个时间预算。理想情况下,以 30 fps 运行的应用程序每帧大约需要 33.33 毫秒(1000 毫秒/30 fps)。同样,60 fps 的目标留下每帧 16.66 毫秒。

设备可以在短时间内超出此预算(例如,过场动画或加载序列),但不能长时间超出此预算。

预设

不要依赖默认设置。使用特定于平台的覆盖选项卡来优化资产,例如纹理和网格几何。不正确的设置可能会导致构建尺寸更大、构建时间更长以及内存使用率较低。考虑使用预设功能来帮助自定义可增强特定项目的基线设置。

限制使用相机

每个摄像机都会产生一些开销,无论它是否在执行有意义的工作。仅使用渲染所需的相机组件。在低端移动平台上,每个摄像头最多可使用 1 毫秒的 CPU 时间。

避免全屏效果

全屏后期处理效果(例如光晕)会显著降低性能。在标题的艺术指导中请谨慎使用它们。

小心使用 Renderer.material

在脚本中访问 Renderer.material 会复制材质并返回对新副本的引用。这会破坏任何已包含该材料的现有批次。如果您希望访问批处理对象的材质,请改用 Renderer.sharedMaterial

您喜欢本文吗?
是的!
还行。