移动端 Unity 光照优化全攻略:从 Tier 分级到 Shader 变体爆炸的完整治理路径
带宽限制 · TDP 约束 · TBDR 架构 · Shader 变体治理 · 中端 vs 高端差异化策略——面向手机独立游戏开发者的光照性能实战手册
一分钟速览
移动端光照优化的黄金法则是:将实时光源数控制在 1–2 盏,以烘焙光照为主,对可编程半透和逐像素光使用严格管控。具体的基线设置:URP 中开启 Per Object Lighting 和 Main Light Casts Shadows,仅使用 1 盏 Directional Light 为主光;所有 Area Light 仅用于烘焙;Shader 变体数控制在 200 以内。以下逐层展开背后的技术原理与操作路径。
为什么移动端光照如此特殊?—— 三个核心约束的理解
桌面 GPU 和移动 GPU 之间的差距不是"性能差多少"的问题,而是架构根本不同。理解这三个约束,是正确优化移动端光照的前提,而不是盲目套用桌面端"降阴影分辨率"这类经典低效操作。
约束一:带宽限制——移动端的真正瓶颈
移动 GPU 的显存带宽(通常 10–25 GB/s)仅是桌面级(300–500 GB/s)的 3%–8%。这意味着频繁的贴图采样、多 Pass 渲染、大量 RT/UV 读写操作的成本远超桌面直觉。光照相关的帧时间中,约 60%–70% 消耗在贴图带宽而非计算上。这对光照优化的启示:减少阴影贴图采样次数、压缩 Lightmap 格式、控制多重采样的重叠范围,比优化 Shader 计算效率回报更高。
约束二:TDP(热设计功耗)—— 持续性能的天花板
移动设备没有主动散热风扇,GPU 的高频运行通常只能维持 30–90 秒,之后因温控被迫降频。一个光照复杂的场景可能在进入后的前 2 秒达到 60fps,随后逐渐滑落到 30fps。这不是性能优化"没做到位",而是热约束的物理边界。因此:目标不应该是"让最差情况的帧率达到 60",而是让"平均帧率稳定且没有明显卡顿",适当接受 30fps 的光照质量基线。
约束三:TBDR(Tile-Based Deferred Rendering)架构——延迟渲染的移动改造
与桌面 GPU 的立即模式(Immediate Mode)不同,移动 GPU 采用 Tile-Based 架构,将屏幕划分为 16×16 像素的 Tile,逐 Tile 完成光照计算。TBDR 的优点是带宽极低(当帧缓冲区驻留芯片缓存时),但代价是:过多光源覆盖同一 Tile 会导致 Multi-Pass 开销剧增。在 Tile 覆盖超过 4 盏实时光源后,每增加一盏,帧时间呈非线性上升。
实战:Unity 图形 Tier 系统的应用
Unity 的 Graphics Tier 系统允许针对不同性能等级的设备使用不同的光照质量配置。很多开发者忽视了这个内置系统,导致要么让高端设备享受到的画面被低端设备拖累,要么让低端设备因过高的光照预算体验糟糕。
| Tier | 目标设备 | 实时光源数上限 | 阴影分辨率 | Lightmap 压缩 | 注 |
|---|---|---|---|---|---|
| Tier 1(Low) | 入门机(2GB RAM) | 1(仅 Directional) | 512 | ETC2 4×4 | 主要依赖烘焙,无实时阴影 |
| Tier 2(Medium) | 中端机(4GB RAM) | 2(Directional + 可选 1 Point) | 1024 | ETC2 4×4 / ASTC 6×6 | Directional 开启阴影,Point 不开启 |
| Tier 3(High) | 旗舰机(6GB+ RAM) | 3(Directional + 2 Point/Spot) | 2048 | ASTC 4×4 | 可开启 1 盏 Point 的实时阴影 |
配置路径:在 Project Settings > Graphics > Tier Settings 中,激活 per-tier Quality 选项,分别为每个 Tier 设置不同的光照参数。注意:需要在 Quality Settings 中为不同 Quality Level 分配对应的 Tier,否则配置不会生效。
Shader 变体爆炸:移动端光照需求的黑洞
Shader 变体爆炸是移动端光照优化的头号隐秘杀手。每开启一个光照特性(Directional Shadow、Point Light Shadow、Lightmap、LPPV 等),Shader 编译器会生成该特性的独立变体。一个普通的 URP Lit Shader,在开启所有光照选项后,可能产生 300–500 个变体,而常用的做法是只预编译其中的 40–80 个。
变体爆炸的实际损害:增加 APK 包体 10–30MB、延长首次加载时间 5–15 秒、运行时增加 Shader 编译卡顿(每个新变体出现时产生 50–300ms 的掉帧)。
治理策略四项原则:
- 裁剪不在移动端使用的特性:在 URP Asset 中关闭 Additional Lights(仅保留 Main Light),或限制 Additional Lights Count ≤ 1
- 使用 ShaderVariantCollection 预热:在 Editor 中选择 Build > Shader Variant Prewarm,生成 Collection 并分配至启动时加载
- 禁用不必要的 Shadow Matte:不使用 Shadowmasks(UTS 方案下沉至 Tier 3 独占)
- 为移动端创建定制 Shader:在 URP Lit Shader 基础上手动裁剪不必要的光照计算宏(USE_NORMAL_MAP、_ADDITIONAL_LIGHTS 等),将变体数控制在 50–80 个内
中端 Android 设备的光照质量基线建议
以下基线基于 Snapdragon 778G / MediaTek Dimensity 920 级别设备(2024–2025 年最广泛覆盖的中端 SoC),建议作为项目默认标准:
| 设定项 | 建议值 | 若性能不足可降方案 |
|---|---|---|
| Main Light Shadow | 1024 × 2 Cascades | 关闭 Shadow 或降至 512 |
| Additional Lights | 1(禁止实时阴影) | 0 |
| Lightmap Format | ASTC 6×6(如支持) | ETC2 4×4 |
| Lightmap Resolution | 10–20 texels/unit | 5–10 texels/unit |
| Reflection Probes | 1(烘焙) | 使用 Box Projection 静态 |
| SSAO/SSGI | 关闭 | — |
| Post Processing | 仅 Tonemapping + FXAA | 仅 Tonemapping |
高端设备的差异化策略
对于旗舰设备(Snapdragon 8 Gen 3 / Apple A17 Pro),可在不破坏帧率稳定的前提下适当提升光照质量:
- 增加 Cascade Count:2→3(注意不要开到 4 级)
- 提升 Shadow Resolution:1024→2048
- 开启 Bloom(低强度,阈值 1.2–1.5)
- 考虑使用 HDRP 的 Ray Traced AO 作为轻度光追特性
- 开启 High Quality Lightmap(Directional Lightmap)
但始终注意 TDP 约束:即使旗舰机,持续 60fps 高强度光照也无法维持超过 3–5 分钟,建议设置 Power-saving 模式自动降级为 Tier 2 基线。
框架实操:Profiler 检查清单
在结束光照优化前,用 Unity Profiler 做一次确诊检查:
- GPU > Rendering > Forward Pass:此项 ≤ 6ms(移动端 60fps 目标)
- GPU > Lighting 子分类 ≤ 1.5ms
- Shadows.RenderShadowMap ≤ 1ms(含所有级联)
- Draw Calls(帧计数)≤ 180–220(移动端安全区)
- Shader.Parse 和 Shader.CreateGpuProgram 不应在运行时出现(说明没有转译未预热变体)
推荐资源
- Unity 移动端优化指南(Unity Mobile Optimization Best Practices)
- ARM Mali GPU 开发者文档(了解不同 TBDR 架构的差异)
- Substance Painter 输出光照优化——减少不必要的贴图通道以节省带宽