遵循以下最佳实践以优化 Android 游戏中材质和着色器的使用。
材质和着色器是现代 3D 艺术的核心构建块。在最大数量的设备上运行良好的 3D 游戏始于旨在充分利用图形处理器的 3D 艺术。本指南重点介绍了移动设备上材质和着色器的优化和最佳实践,以提高游戏性能并最大程度地降低功耗。
本文的部分内容基于 Arm Limited 贡献和版权的作品。
游戏引擎移动友好着色器
游戏引擎在关联材质和着色器的方式上有所不同。Unity 引擎可以创建多个着色器,但每个材质只能分配一个着色器。虚幻引擎 4 可以根据目标平台为材质应用不同的着色器。
有关着色器和材质的定义,请参阅 艺术家材质和着色器最佳实践。
如果您使用的是 Unity 或虚幻引擎 4 等游戏引擎,请使用为移动硬件设计的内置着色器。这些着色器包含简化的功能实现,可在移动设备上获得更高的性能。如果可能,在配置材质时关闭不使用的功能。这些功能可能是颜色着色或细节贴图之类的东西。禁用未使用的功能允许引擎从最终着色器程序中省略它们,从而提高性能。
Unity
Unity 包含多个渲染引擎。对于现代移动游戏,最佳选择是 通用渲染管道 (URP)。URP 包含一组标准着色器,这些着色器会根据目标平台自动调整复杂性。旧版 Unity 渲染器包含一组专为移动平台设计的着色器。这些着色器分组在“移动”类别中。
虚幻引擎 4
虚幻引擎将根据所选目标平台选择移动着色器。移动着色器的视觉输出可能与默认的着色器模型 5 着色器不同。您可以在虚幻编辑器中更改预览渲染级别以模拟移动着色器的渲染输出。尽管存在一些差异,但虚幻引擎在所有平台上都使用相同的材质处理流程,因此移动着色器通常会与默认着色器具有相似的视觉效果和行为。
最小化纹理采样器
针对移动设备的游戏应在其材质中使用尽可能少的纹理。每个添加的纹理都需要额外的纹理采样,这会消耗内存带宽并增加功耗。虚幻引擎 4 建议在移动设备上运行时最多使用五个材质纹理。即使五个纹理采样器对于许多设备上的广泛使用来说也可能过分昂贵。最小化纹理采样器计数的策略包括
- 使用纹理打包来组合单通道纹理。有关此技术的更多信息,请参阅 纹理 指南。
- 使用数值常量代替从纹理读取粗糙度或金属度等参数的数据。
- 使用无光照着色器或简单的光照模型,以便能够省略在更复杂的光照模型中支持光照计算所需的纹理。
尽可能禁用光照
有光照与无光照是着色器和材质的常见区别。实时光照涉及着色器中的额外计算。根据正在实现的光照系统类型,可能需要材质纹理,这些纹理会使用更多内存空间和带宽。对于移动游戏,特别是那些针对功能较弱的硬件的游戏,最大程度地减少实时光照的使用对于实现最佳性能非常重要。您应该考虑围绕在没有实时光照的情况下也能很好地工作的设计(例如风格化或卡通艺术)来设计您的艺术指导。
最小化透明度的使用
尽可能使用不透明材质。渲染具有透明度的对象始终比渲染等效的不透明对象更昂贵。移动图形硬件的设计使得透明度渲染起来比计算机或游戏机图形硬件上的渲染相对更昂贵。在游戏中绘制许多透明对象,尤其是在彼此叠加渲染时,会对性能产生负面影响。
多次绘制同一像素的问题称为过度绘制。应避免多层透明过度绘制。许多游戏都具有可视化过度绘制的诊断工具,以帮助检测和消除它。使用这些工具来提高游戏性能并识别导致帧速率下降的问题区域。
使用合适的 Alpha 方法
实现透明度的最常见方法是 Alpha 混合和 Alpha 测试。
Alpha 测试将使对象材质看起来是 100% 不透明或 100% 透明。您可以配置此截止值的 Alpha 值阈值。在 Unity 中,此类型的透明度称为“剪切”。在虚幻引擎 4 中,它称为“遮罩”混合模式。
Alpha 混合允许对象材质具有一系列透明度,并且可以使对象看起来部分透明。Unity 将此类型的透明度称为“透明”。在虚幻引擎 4 中,它称为“半透明”混合模式。
Alpha 混合通常比 Alpha 测试产生更好的视觉效果。但是,对于某些类型的网格(例如树叶),当网格在运动中查看时,Alpha 混合可能看起来很奇怪。这是由于感知叶片和树枝以错误的顺序渲染造成的。Alpha 测试最大程度地减少了这种影响,但代价是在叶片和树枝上增加了混叠和锐利边缘。
Alpha 混合和 Alpha 测试渲染相同网格可能需要不同的时间。对于任一模式都能产生可接受的视觉输出的网格,您应该进行基准测试,以查看哪种方法的性能更好。
分析着色器复杂度
纹理采样器、光照和透明度等渲染功能都会增加着色器复杂度并降低渲染性能。您可以使用游戏引擎内置的工具以及外部图形工具来评估您的着色器复杂度。
虚幻引擎 4 包含一个“着色器复杂度”视图模式,该模式提供场景中对象的成本估算。
您还可以使用虚幻引擎的“材质统计”功能在创作材质时分析材质的成本。
在顶点着色器中计算
渲染着色器计算通常在顶点着色器和片段(也称为像素)着色器之间进行划分。渲染的片段数量通常大于顶点的数量。如果可以在顶点着色器中执行昂贵的计算,那么它的运行频率将低于在片段着色器中执行时。
但是,如果片段着色器使用此数据,则必须从顶点着色器传递它。如果要传输的数据量过大,则在片段着色器中执行计算可能会具有更高的性能。您可以使用性能分析工具评估平铺器利用率,以确定一组计算的最佳着色器位置。虚幻引擎 4 具有一个自定义 UV功能,可以帮助进行此性能分析。
避免昂贵的数学运算
数学运算用于着色器程序中,以控制着色器输出的行为和外观。常见的运算包括基本算术、幂、取整、对数等。数学运算的计算成本并不相同。一个充满昂贵运算的着色器将执行得更慢,尤其是在旧设备上。相对廉价的运算示例包括
- 加法
- 减法
- 乘法
更昂贵的运算包括
- 除法
- 超越函数(sin,cos,幂,log,tan)
经常分析性能
您的性能瓶颈可能并不总是显而易见的。避免假设问题所在,并使用性能分析工具评估渲染性能。确保您在进行任何优化之前和之后都进行测试,以准确评估其影响。