遵循这些最佳实践,优化您的 Android 游戏中的材质和着色器使用。
材质和着色器是现代 3D 艺术的核心构建块。在最多设备上运行良好的 3D 游戏,首先需要设计 3D 艺术,以充分利用图形处理器。本指南重点介绍移动设备上材质和着色器的优化和最佳实践,以提高您的游戏性能并最大限度地降低功耗。
本文部分内容基于 Arm Limited 贡献和拥有版权的作品。
游戏引擎移动友好型着色器
游戏引擎在关联材质和着色器的方式上有所不同。Unity 引擎可以创建多个着色器,但每个材质只能分配一个着色器。虚幻引擎 4 可以根据目标平台对材质应用不同的着色器。
有关着色器和材质的定义,请参阅面向艺术家的材质和着色器最佳实践。
如果您使用 Unity 或虚幻引擎 4 等游戏引擎,请使用为移动硬件设计的内置着色器。这些着色器包含简化的功能实现,可在移动设备上提供更高的性能。如果可能,在配置材质时关闭您不使用的功能。这些功能可能是颜色着色或细节贴图等。禁用未使用的功能可让引擎在最终着色器程序中省略它们,从而获得更好的性能。
Unity
Unity 包含多个渲染引擎。对于现代移动游戏,最佳选择是 通用渲染管线 (URP)。URP 包含一组标准着色器,可根据目标平台自动调整复杂程度。旧版 Unity 渲染器包含一组专为移动平台设计的着色器。这些着色器归入移动类别。
虚幻引擎 4
虚幻引擎将根据所选目标平台选择移动着色器。移动着色器的视觉输出可能与默认的 Shader Model 5 着色器不同。您可以在虚幻编辑器中更改“预览渲染级别”以模拟移动着色器的渲染输出。尽管存在一些差异,但 Unreal 对所有平台上的材质使用相同的处理方式,因此移动着色器通常会具有与默认着色器类似的视觉效果和行为。

最大限度地减少纹理采样器
针对移动设备的游戏应在其材质中使用最少量的纹理。每增加一个纹理都需要额外的纹理采样,这会消耗内存带宽并增加功耗。虚幻引擎 4 建议在移动设备上运行时最多使用五个材质纹理。即使是五个纹理采样器对于在许多设备上广泛使用来说也可能过于昂贵。最大限度地减少纹理采样器数量的策略包括:
- 使用纹理打包来组合单通道纹理。有关此技术的更多信息,请参阅纹理指南。
- 用数字常量替换粗糙度或金属度等参数的数据,而不是从纹理中读取。
- 使用无光照着色器或简单的光照模型,以便能够省略更复杂光照模型中支持光照计算所需的纹理。
尽可能禁用光照
有光照与无光照是着色器和材质的常见区别。实时光照涉及着色器中的额外计算。根据所实现的光照系统类型,可能需要材质纹理,这会占用更多内存空间和带宽。对于移动游戏,特别是针对性能较低硬件的游戏,最大限度地减少实时光照的使用对于实现最佳性能至关重要。您应该考虑围绕无需实时光照也能很好地工作的设计来规划您的美术方向,例如风格化或卡通艺术。

最大限度地减少透明度使用
尽可能使用不透明材质。渲染透明对象总是比渲染等效的不透明对象更昂贵。移动图形硬件的设计使得透明度的渲染成本相对高于计算机或游戏机图形硬件。在您的游戏中绘制许多透明对象,尤其是当它们相互叠加渲染时,将对性能产生负面影响。
多次在同一像素上绘制是一个被称为“过度绘制”的问题。应避免多层透明度过度绘制。许多游戏都有诊断工具来可视化过度绘制,以帮助检测和消除它。使用这些工具来提高游戏性能并识别导致帧速率下降的问题区域。


使用适当的 Alpha 方法
实现透明度最常用的方法是 Alpha 混合和 Alpha 测试。
Alpha 测试将使对象材质看起来要么 100% 不透明,要么 100% 透明。您可以为此截止配置 Alpha 值阈值。在 Unity 中,这种类型的透明度称为 Cutout。在虚幻引擎 4 中,它称为 Masked 混合模式。
Alpha 混合允许对象材质具有一定范围的透明度,并可以使对象看起来部分透明。Unity 将这种类型的透明度称为 Transparent。在虚幻引擎 4 中,它称为 Translucent 混合模式。

Alpha 混合通常比 Alpha 测试产生更优越的视觉效果。然而,对于某些类型的网格,例如树叶,当网格在运动中查看时,Alpha 混合可能会显得奇怪。这是由于感知到叶子和树枝以错误的顺序渲染所致。Alpha 测试最大限度地减少了这种效果,但代价是叶子和树枝上的锯齿和尖锐边缘增加。
Alpha 混合和 Alpha 测试渲染相同网格所需的时间可能不同。对于两种模式都能产生可接受视觉输出的网格,您应该进行基准测试,看看哪种方法性能更好。
分析着色器复杂度
纹理采样器、光照和透明度等渲染功能都会增加着色器复杂度并降低渲染性能。您可以使用游戏引擎内置的工具以及外部图形工具来评估您的着色器复杂度。
虚幻引擎 4 包含一个 Shader Complexity 视图模式,可提供场景中对象的成本估算。

您还可以使用虚幻引擎的 Material Stats 功能在创作时分析材质成本。

在顶点着色器中计算
渲染着色器计算通常在顶点着色器和片元(也称为像素)着色器之间进行分割。渲染的片元数量通常会大于顶点数量。如果可以在顶点着色器中执行昂贵的计算,那么它的运行频率会低于在片元着色器中执行。
然而,如果这些数据被片元着色器使用,则必须从顶点着色器传递。如果传输的数据量过大,在片元着色器中执行计算可能会有更高的性能。您可以使用分析工具来评估平铺器利用率,以确定一组计算的最佳着色器位置。虚幻引擎 4 具有 自定义 UV 功能,可以帮助进行此分析。
避免昂贵的数学运算
数学运算用于着色器程序中,以控制着色器输出的行为和外观。常见的运算包括基本算术、幂、底、对数等。数学运算的计算成本不同。一个充满昂贵运算的着色器会运行得更慢,尤其是在旧设备上。相对廉价的运算示例包括:
- 加法
- 减法
- 乘法
更昂贵的运算包括:
- 除法
- 超越函数(sin、cos、幂、log、tan)
经常分析性能
您的性能瓶颈可能并不总是显而易见的。避免猜测问题区域,并使用分析工具来评估您的渲染性能。务必在任何优化前后进行测试,以准确衡量其影响。