2.1 材质质量档与开销红线:移动材质的成本是可查的数字

核心结论

PC 上优化材质靠"感觉和经验的八成",移动端上靠数字。Epic 为每个渲染路径都定义了质量档(Quality Level)和指令数红线,材质编辑器里按数字查、按数字砍,比反复打包看帧率高效十倍。

各平台材质质量档速查

移动渲染器按平台和渲染路径分为不同的质量档,直接决定可用的材质特性与指令数上限:

平台/路径 质量档 说明 官方文档
Android ES3.1 质量档 0~3 0 最精简(OpenGL ES 3.1 基线),3 最高 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/android-material-quality---es3-83fa
Android Vulkan 质量档 0~3 Vulkan 路径特性更多,同档位开销略低 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/android-material-quality-vulka-c4a2
Android SM5 高端档 仅推荐高端机,桌面级特性子集 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/android-sm5-material-quality-52dd
iOS 质量档 0~3 Metal 路径,iPhone 上普遍能吃更高档 https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/ios-material-quality-settings-c5fa

实操:不要全项目一个档打天下。正确做法是按第一章的设备分档,给低/中/高三档设备分别配 DeviceProfile,材质质量档随档位升降。Lyra 的设备描述配置就是这个套路。

指令数红线:材质里的"预算表"

移动材质优化第一工具不是材质编辑器,是平台统计信息。把材质编译到目标平台后,查看 Material -> Shader Code -> HLSL 或直接看材质编辑器顶部的统计:

指标 经验红线(中端机 ES3.1) 说明
着色器指令数 基础材质 < 200 条 超过 300 就要警惕,超过 500 基本推倒
纹理采样器 <= 4 个 移动端采样器是稀缺资源
材质输出 只接必要引脚 比如前向渲染不接 Specular 以外的高开销通道

经验换算:一个全功能移动材质(法线+粗糙度+金属度+AO+自发光)在 ES3.1 上约 120~180 条指令。加一个细节纹理(Detail Normal)大约 +30~50 条,加一层世界对齐渐变大约 +20 条。你的"预算"就是从 200 条里扣。

常见坑与解法

坑 1:PC 上流畅、真机上糊

原因:材质质量档在编辑器里默认按桌面设置编译,真机上按设备档降级,有些特性(如高精度世界坐标偏移)被裁掉。

解法:在编辑器里就用 -SM5 之外的移动预览模式(视口设置切到 Android/iOS 预览),或者直接在目标平台上跑 Mobile Preview。看不到降级效果等于没优化。

坑 2:纹理采样器爆掉

原因:移动端采样器上限低(ES3.1 常见 8 个,但算上引擎自带的就可能不够)。

解法:把多张遮罩贴图打包进 RGBA 通道(通道打包),一张贴图当四张用。这是移动美术的基本功。

坑 3:材质实例(MI) inherits 了贵参数

原因:主材质里接了所有引脚,实例即使不启用也照编译。

解法:对开销大的引脚,主材质里做好"开关"(静态切换参数 StaticSwitch),实例不勾就不编译那段。

我的定档工作流

  1. 先按机型的 GPU 等级分三档(参考第一章 DeviceProfile)。
  2. 主材质做成"高配版",所有降级用静态开关参数控制。
  3. 每档编译到目标平台,查指令数,超过红线的砍细节纹理/降精度。
  4. 真机跑一遍 Battle Scene,记录每材质的实际耗时分布。

相关节点速查

  • 查指令数:材质编辑器 -> Shader Code -> HLSL(按目标平台)
  • 通道打包:贴图导入时 compression 设为 TC_Normalmap/TC_Masks 之类,配合 Mask/Mask R/G/B/A 节点
  • 静态开关:StaticSwitch + StaticSwitchParameter(材质实例可勾选)

心得:我刚做移动项目时按 PC 习惯写材质,结果中端机渲染线程常年 20ms。后来把每个材质的指令数贴成"预算表"挂墙上,每加一个特性先查数字,渲染线程回到 8ms 以内。数字比直觉可靠得多。