1. 移动端全局光照的破局点:为什么Lumen上手机这么难
1.1 从主机到掌上:Lumen的技术底色
虚幻引擎5的Lumen是一套全动态全局光照与反射系统,它的核心思路是用软件或硬件光线追踪在场景中实时弹射光线,从而让间接光照、软阴影和环境反射都随光源和物体移动即时更新。在PC和主机上,这套系统依赖GPU的硬件光追单元和大容量显存,跑起来尚且吃力,放到功耗和散热都极其受限的移动端,难度直接翻倍。
我最早在桌面端折腾Lumen的时候就发现,哪怕是一张中端独显,开高画质Lumen之后帧数也会明显下滑。原因在于Lumen每一帧都要对场景做多层级的距离场追踪和辐照度缓存更新,这些计算量在移动GPU上会被放大好几倍。所以当看到“异环”这款游戏在骁龙平台上演示Lumen效果时,我第一反应是好奇它到底做了多少取舍。
1.2 移动端Lumen的三座大山
移动端跑Lumen,绕不开三个硬约束。第一是算力,移动GPU的ALU吞吐和带宽跟桌面级差了一个数量级,软件光追的射线求交开销很难扛住。第二是功耗与发热,手机没有主动散热,持续高负载几分钟就会降频,帧率曲线会像过山车。第三是内存带宽,Lumen的辐照度缓存和距离场数据体积不小,移动端LPDDR的带宽要同时喂给渲染、逻辑和音频,留给全局光照的余量很紧张。
“异环”这次演示能跑起来,说明它在算法层面做了针对性裁剪。从公开的演示画面看,它的间接光照更新频率明显低于直射光,反射也更多依赖屏幕空间而非完整的光追弹射。这是一种典型的移动端思路:把有限的算力花在玩家最容易感知的地方,其余部分用近似和缓存兜底。
1.3 ANF在管线里的位置
ANF这个词在移动渲染语境下,通常指的是一套面向神经网络的帧生成或超分辅助框架,它和Lumen是配合关系而非替代关系。Lumen负责把光照算对,ANF负责把算出来的画面以更低的成本呈现到屏幕上。两者叠加,才能在移动端有限的预算里同时保住光照质量和帧率。
我个人的理解是,ANF在这里承担的是“放大器”角色:Lumen在较低内部分辨率下计算光照,ANF再把结果重建到目标分辨率,并对时序上的闪烁做抑制。这样Lumen的射线数量和缓存更新频率都可以降下来,整体功耗也就压住了。这个组合思路,和桌面端“光追加DLSS”的搭配逻辑是一脉相承的。
2. 骁龙平台上的渲染管线拆解
2.1 骁龙GPU的架构特点与Lumen的适配
骁龙8系移动平台的Adreno GPU采用的是统一着色器架构,它的优势在于灵活的负载分配,但短板是缺少桌面级那样的专用光追硬件单元。这意味着Lumen的硬件光追路径在骁龙上基本走不通,只能走软件追踪或者混合方案。
软件追踪在Adreno上的关键优化点是降低射线复杂度。桌面端Lumen的射线求交可以做到比较精细的层级,移动端则要把距离场的层级压扁,用更粗的体素来近似场景。粗体素带来的问题是漏光和阴影偏软,但换来的是射线求交次数大幅下降。从演示画面看,“异环”的场景光照过渡比较柔和,这既是美术风格的选择,也恰好掩盖了粗体素近似的瑕疵。
2.2 可变速率着色与分辨率策略
移动端保帧率的一个常用手段是可变速率着色,也就是对画面不同区域用不同的着色精度。玩家视线焦点区域全速率渲染,边缘和运动模糊区域降速率。Lumen的辐照度缓存更新也可以套用这个思路:视野中心附近的探针更新频率高,远处和遮挡区域更新频率低。
“异环”的演示里,我注意到角色周围的光照细节明显比远景丰富,这大概率就是可变速率着色加Lumen探针分级更新的结果。这种策略的代价是快速转动视角时边缘可能出现光照滞后,但ANF的时序重建可以在一定程度上把这种滞后抹平。
2.3 带宽优化:把数据留在片上
移动端渲染最大的敌人之一是带宽。Lumen的距离场、辐照度缓存、屏幕空间反射的深度缓冲,每一项都要占带宽。骁龙平台的Adreno GPU有较大的片上缓存,优化的关键就是尽量让这些中间数据在片上完成读写,减少往返主存的次数。
具体做法包括:把距离场切成适合片上缓存的小块,按需加载;辐照度缓存用低精度格式存储,牺牲一点精度换带宽;屏幕空间反射的降噪尽量在低分辨率下完成,最后再上采样。这些手段单独看都是常规操作,但组合起来对Lumen这种多pass系统效果很明显。
3. 实操层面的关键配置与调参思路
3.1 项目设置里的Lumen开关组合
在虚幻引擎项目里启用移动端Lumen,第一步是确认渲染路径。移动端默认的前向渲染对Lumen支持有限,需要切到延迟渲染或者移动端延迟渲染路径。具体在项目设置的渲染栏目里,把“移动端着色”改为“延迟着色”,然后勾选“移动端Lumen”相关选项。
这里有个坑:移动端延迟渲染对MSAA的支持不好,抗锯齿要改用TAA或者TSR。而TAA在移动端又容易产生鬼影,尤其是快速移动的物体边缘。我的经验是把TAA的时序权重调低一些,同时配合ANF的时序重建,鬼影会明显减轻。
3.2 Lumen质量档位的取舍
Lumen在移动端通常提供几档质量预设,核心差异在于射线数量、探针更新频率和缓存分辨率。我实测下来的建议是:射线数量优先降,探针更新频率其次,缓存分辨率最后降。因为射线数量直接影响每帧的计算峰值,降它对帧率提升最明显;探针更新频率影响的是光照变化的响应速度,降太多会让光照显得“粘滞”;缓存分辨率影响的是光照细节,降太多会出现明显的块状感。
“异环”演示里的光照看起来比较平滑,没有明显的块状,说明它的缓存分辨率没有压得太狠,而是把预算省在了射线数量和更新频率上。这个取舍顺序值得参考。
3.3 ANF的接入时机
ANF的接入位置很关键。它应该放在Lumen光照计算完成之后、最终后处理之前。如果放得太早,Lumen的低分辨率光照结果会被ANF放大后再参与后续计算,误差会被放大;放得太晚,后处理里的泛光和色调映射又会把ANF的重建结果破坏掉。
接入ANF之后,Lumen的内部渲染分辨率可以降到原生的一半甚至更低。我试过在移动端把内部分辨率降到0.5倍,配合ANF重建,画面在手机屏幕上看起来和0.75倍原生分辨率差别不大,但帧率能提升三成左右。这个收益在移动端非常可观。
4. 常见问题与排查实录
4.1 光照闪烁与探针更新
移动端Lumen最常见的问题是光照闪烁,表现为画面中某些区域的光照亮度在帧与帧之间跳变。这通常是探针更新频率太低,导致相邻帧的探针数据不一致。排查方法是把探针更新频率临时调高,如果闪烁消失,就说明是更新频率的问题。
解决办法不是一味调高频率,而是对探针做分组更新:把场景里的探针分成几组,每帧只更新其中一组,这样既保证了整体响应速度,又摊平了每帧的计算峰值。这个思路和桌面端的探针更新策略是一致的,只是移动端的分组要更粗。
4.2 反射断裂与屏幕空间边界
屏幕空间反射在移动端容易出现断裂,尤其是物体边缘和屏幕边缘。原因是屏幕空间反射只能反射屏幕内可见的内容,屏幕外的东西反射不出来。Lumen的完整光追可以补上这部分,但移动端往往关掉了完整光追,只留屏幕空间反射。
缓解办法是在屏幕空间反射的边界处做淡出,让反射强度平滑过渡到环境光。另外可以把反射的粗糙度阈值调高,让粗糙表面的反射更多依赖环境光而非屏幕空间,这样断裂感会弱很多。“异环”演示里的反射看起来比较柔和,应该就是用了类似的策略。
4.3 发热降频后的帧率崩塌
移动端跑Lumen,发热降频是绕不开的。我实测下来,连续跑十分钟高负载Lumen场景,机身温度上来之后帧率会掉两到三成。应对办法有两个方向:一是动态分辨率,检测到温度升高就自动降低内部分辨率;二是动态质量档位,温度升高时自动把Lumen的射线数量降一档。
这两个手段可以叠加使用,优先级建议是先降分辨率,再降质量档位。因为分辨率降低对画面观感的影响相对均匀,而质量档位降低可能导致光照出现明显瑕疵。动态调整的触发阈值要根据具体机型的散热能力来定,不能一刀切。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方向 | 解决思路 |
|---|---|---|---|
| 光照闪烁 | 探针更新频率低 | 临时调高更新频率观察 | 探针分组更新,摊平峰值 |
| 反射断裂 | 屏幕空间边界 | 检查屏幕边缘反射 | 边界淡出,提高粗糙度阈值 |
| 帧率崩塌 | 发热降频 | 监控温度与帧率曲线 | 动态分辨率加动态质量档位 |
| 画面块状 | 缓存分辨率低 | 检查辐照度缓存设置 | 适当提高缓存分辨率 |
| 鬼影严重 | TAA时序权重高 | 检查抗锯齿设置 | 降低时序权重,配合ANF重建 |
5. 从演示到落地:移动端Lumen的工程化建议
5.1 美术资产的配合策略
移动端Lumen要跑得好,美术资产必须配合。具体来说,场景里的光源数量要控制,动态光源尤其要少,尽量用静态光源加Lumen的间接光照来营造氛围。材质的粗糙度和金属度参数也要规范,粗糙表面多依赖环境光,光滑表面才用屏幕空间反射,这样能把反射的计算量花在刀刃上。
“异环”的美术风格偏柔和,大面积使用漫反射材质,这恰好契合移动端Lumen的能力边界。如果换成大量镜面金属的场景,移动端Lumen的压力会大很多。所以美术和渲染的配合,在移动端比桌面端更重要。
5.2 性能预算的分配
移动端的总帧时间预算通常在16毫秒左右,Lumen能分到的份额很有限。我的建议是把Lumen的预算控制在4到6毫秒,剩下的留给几何、材质、后处理和ANF。如果Lumen超预算,优先砍射线数量和探针更新频率,不要动缓存分辨率,因为缓存分辨率一降,画面瑕疵会非常明显。
ANF的预算大概在1到2毫秒,它换来的是Lumen内部分辨率可以降一半,这笔账怎么算都划算。所以ANF的接入优先级应该排在Lumen质量档位调整之前。
5.3 跨机型适配的弹性设计
骁龙8系内部也有性能差异,旗舰和次旗舰的GPU规模不一样。工程上要做弹性设计,根据机型性能自动选择Lumen质量档位和ANF的放大倍率。检测方式可以是读取GPU型号,也可以是运行时动态测帧,后者更准确但需要预热时间。
我倾向于用运行时动态测帧加机型白名单的组合:白名单里的旗舰机型直接开高画质,白名单外的机型先跑一段测帧,再决定档位。这样既保证了旗舰机型的体验,又避免了低性能机型一上来就卡顿。
5.4 后续可扩展的方向
这套Lumen加ANF的移动端方案,后续可以往几个方向扩展。一是把ANF升级成更激进的帧生成,在Lumen光照结果的基础上插帧,进一步降低Lumen的更新频率。二是把Lumen的探针数据做成流式加载,大世界场景里只加载玩家附近的探针,远处用低精度近似。三是把光照计算部分放到异步计算队列,和几何渲染重叠,提高GPU利用率。
这些方向在桌面端都有成熟实践,搬到移动端的主要障碍还是功耗和带宽。随着骁龙平台GPU规模继续增长,这些方案的可行性会越来越高。“异环”这次的演示,算是给移动端全局光照探了一条可落地的路。
我个人在实际折腾移动端Lumen的过程中最大的体会是:不要试图把桌面端的方案原样搬过来,移动端的每一毫秒和每一兆带宽都要精打细算。Lumen负责把光照算对,ANF负责把画面补好,美术负责把瑕疵藏住,三者缺一不可。这套组合拳打下来,手机上的全局光照才能既好看又跑得动。