Hero background image

移动优化技巧,技术艺术家第二部分

为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

您将从此页面获得: 我们有用提示的第二部分 用于优化您的艺术素材以适应移动游戏。第一部分在 这里.

您可以在 这本全面的电子书 和这个关于 移动应用程序的3D艺术优化.

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

光照

来自控制台和PC的相同物理基础照明和材料也可以通过Universal Render Pipeline(URP)扩展到您的手机或平板电脑。

批处理您的绘制调用

在每一帧中,Unity确定必须渲染的对象,然后创建绘制调用。绘制调用是对图形API的调用,以绘制对象(例如,一个三角形),而批处理是一组要一起执行的绘制调用。将对象批处理以便一起绘制,最小化绘制批次中每个对象所需的状态更改。这通过减少渲染对象的CPU成本来提高性能。

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

SRP批处理:在您的URP资产的高级选项中启用SRP批处理器。这可以显著加快您的CPU渲染时间,具体取决于场景。

避免过多的动态光源

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

请查看此功能比较表以了解URP和内置渲染管线实时光源的具体限制。

禁用阴影

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

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

Unity光照图示意图
禁用阴影投射以减少绘制调用。

将您的光照烘焙到光照贴图中

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

烘焙的阴影和光照可以在运行时无性能损失地渲染。渐进式CPU和GPU光照图生成器可以加速全局光照的烘焙。

请遵循手册这篇关于光照优化的文章以开始在Unity中进行光照图生成。

Unity编辑器中的多个光照层
层可以将您的光源影响限制在特定的剔除掩码内。

使用光源层

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

Unity编辑器中的光探针

为移动物体使用光探针

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

反射球与立方体相交

最小化反射探针

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

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

注意透明材料

渲染透明对象总是比渲染不透明对象使用更多的 GPU 资源,尤其是当透明对象多次重叠渲染时,这个过程称为过度绘制。尽可能使用不透明材质是一种良好的实践,特别是在移动平台上。您可以使用 RenderDoc 图形调试器检查过度绘制。

保持着色器简单

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

为了达到性能目标,尽可能考虑使用半精度的 Unlit Opaque 材质,并注意节点中的复杂操作。在 这个会话 中找到更多关于 Shader Graph 的提示。

有光与无光无光着色器

创建着色器时,您可以决定材质如何对光线做出反应。大多数着色器被分类为有光照或无光照。无光照着色器是最快和计算成本最低的着色模型。如果您针对的是低端设备,请使用它。

需要考虑的关键点包括:

  • 光照不会影响无光照着色模型。这意味着许多计算,例如高光计算,是不需要的。结果是更便宜或更快的渲染。
  • 使用类似卡通的风格艺术方向与未照明的阴影效果相结合效果很好。在为移动平台开发游戏时,这种风格值得考虑。
Unity 编辑器中的 Shader Graph
着色器图中的顶点位移

顶点着色器中的数学运算

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

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

SRP批处理器

在切换 SRP Batcher 时,请观察统计窗口和分析器视图中的渲染部分的顶点图。除了 FPS 的提升外,处理的三角形和顶点数量显著减少。由于我们的对象使用与 URP 兼容的着色器,渲染管线会自动批处理所有相关几何数据,以减少处理的数据量。

角色动画

默认情况下,Unity 使用通用骨架导入动画模型,但开发人员在为角色动画时通常会切换到人形骨架。人形骨架比等效的通用骨架消耗 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