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),实例不勾就不编译那段。
我的定档工作流
- 先按机型的 GPU 等级分三档(参考第一章 DeviceProfile)。
- 主材质做成"高配版",所有降级用静态开关参数控制。
- 每档编译到目标平台,查指令数,超过红线的砍细节纹理/降精度。
- 真机跑一遍 Battle Scene,记录每材质的实际耗时分布。
相关节点速查
- 查指令数:材质编辑器 -> Shader Code -> HLSL(按目标平台)
- 通道打包:贴图导入时 compression 设为 TC_Normalmap/TC_Masks 之类,配合 Mask/Mask R/G/B/A 节点
- 静态开关:
StaticSwitch+StaticSwitchParameter(材质实例可勾选)
心得:我刚做移动项目时按 PC 习惯写材质,结果中端机渲染线程常年 20ms。后来把每个材质的指令数贴成"预算表"挂墙上,每加一个特性先查数字,渲染线程回到 8ms 以内。数字比直觉可靠得多。
