Unity 光照技术精华专题进阶创作实践18 / 25 已发布

移动端 Unity 光照优化全攻略:从 Tier 分级到 Shader 变体爆炸的完整治理路径

带宽限制 · TDP 约束 · TBDR 架构 · Graphics Tier · 中端vs高端差异化策略

· 20 分钟阅读·1.4k 阅读·108
移动端 Unity 光照优化全攻略:从 Tier 分级到 Shader 变体爆炸的完整治理路径 — Unity 光照技术精华专题

移动端 Unity 光照优化全攻略:从 Tier 分级到 Shader 变体爆炸的完整治理路径

一分钟速览

移动端光照优化的黄金法则是:将实时光源数控制在 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)512ETC2 4×4主要依赖烘焙,无实时阴影
Tier 2(Medium)中端机(4GB RAM)2(Directional + 可选 1 Point)1024ETC2 4×4 / ASTC 6×6Directional 开启阴影,Point 不开启
Tier 3(High)旗舰机(6GB+ RAM)3(Directional + 2 Point/Spot)2048ASTC 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 的掉帧)。

治理策略四项原则:

  1. 裁剪不在移动端使用的特性:在 URP Asset 中关闭 Additional Lights(仅保留 Main Light),或限制 Additional Lights Count ≤ 1
  2. 使用 ShaderVariantCollection 预热:在 Editor 中选择 Build > Shader Variant Prewarm,生成 Collection 并分配至启动时加载
  3. 禁用不必要的 Shadow Matte:不使用 Shadowmasks(UTS 方案下沉至 Tier 3 独占)
  4. 为移动端创建定制 Shader:在 URP Lit Shader 基础上手动裁剪不必要的光照计算宏(USE_NORMAL_MAP、_ADDITIONAL_LIGHTS 等),将变体数控制在 50–80 个内

中端 Android 设备的光照质量基线建议

以下基线基于 Snapdragon 778G / MediaTek Dimensity 920 级别设备(2024–2025 年最广泛覆盖的中端 SoC),建议作为项目默认标准:

设定项建议值若性能不足可降方案
Main Light Shadow1024 × 2 Cascades关闭 Shadow 或降至 512
Additional Lights1(禁止实时阴影)0
Lightmap FormatASTC 6×6(如支持)ETC2 4×4
Lightmap Resolution10–20 texels/unit5–10 texels/unit
Reflection Probes1(烘焙)使用 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 输出光照优化——减少不必要的贴图通道以节省带宽

关键词

移动端优化TBDR带宽限制TDP 热约束Shader 变体URP 移动端Graphics TierLightmap 压缩ASTCGPU Profiler独立游戏移动端光照基线
文章标签
Unity 光照URP 光照HDRP 光照Global IlluminationLight Probes烘焙光照EnlightenLPPV实时GI独立游戏光照优化CSMShadow Map
更多专题全部专题
觉得有价值?点赞或收藏支持内容持续产出。
← 返回专题:Unity 光照技术精华专题