解释Forward+ Tile-Based Lighting在移动端的性能
解读
面试官问“解释性能”,并不是让你背定义,而是想看三件事:
- 你是否知道Forward+在移动GPU上的带宽瓶颈与算力瓶颈分别在哪;
- 能否给出量化指标(Tile大小、光源数、带宽占用、ALU周期);
- 是否能把“纸上理论”翻译成Unity可落地的优化动作,让项目在中低端骁龙680/天玑700上也能跑稳30帧。
知识点
- Forward+ = Forward渲染 + Z-prepass + 屏幕空间分块(Tile/Cluster)光照;
- 移动端Tile尺寸通常选16×16或32×32,与Mali/Adreno的on-chip tile memory对齐;
- 光源剔除用Compute Shader做bit-mask光源列表,带宽节省关键在把Light Buffer从128 Byte/light压缩到12 Byte/light(Unity URP 16.0的LightLoop已做);
- 带宽公式:每像素每帧读取G-buffer≈0,Forward+只读Depth+LightList,4 Byte/pix;若光源数>96,LightList带宽反超传统Deferred;
- ALU瓶颈:每个Tile内光源数>32时,loop展开导致Register pressure↑,Adreno 610统一渲染架构下wave32占满后IPC骤降;
- 热路径:Unity URP Forward+在BuildPerTileLightListJob与RenderOpaqueForward两个Pass,GPU时钟占用**>45 %**即判定为瓶颈;
- 量化经验:骁龙778G + 1080p + 64动态光源,Tile 32×32,GPU耗时4.1 ms;Tile 16×16,GPU耗时3.3 ms,但CPU端BuildJob耗时+0.4 ms,需要权衡CPU-GPU并行;
- 极限优化:开启FPTL-Cluster(3D Clip)可把光源数上限提到256,但on-chip memory溢出会触发System Memory Fallback,帧时间抖动**>1.2 ms**,需用Vulkan subpass+input attachment把Tile memory钉在64 KB以内。
答案
Forward+在移动端的核心优势是把光照计算从逐像素移到逐Tile,利用on-chip tile memory把带宽压到传统Deferred的1/3;但性能拐点出现在单Tile光源数>32或总光源数>96时,LightList带宽与ALU循环开销反超。以Unity URP为例,在1080p、骁龙680上:
- 选16×16 Tile,Light Buffer压缩到12 Byte/light,64动态光源场景GPU耗时3.8 ms;
- 若Tile改32×32,GPU降至3.1 ms,但CPU BuildJob耗时增加0.3 ms,需把Job拆分到Worker Thread并用BatchMinMax裁剪,保证总帧时间<33 ms;
- 当光源数>96时,bit-mask列表大小超过4 KB/Tile,触发System Memory Fallback,帧时间抖动**+1.5 ms**,此时应启用Clustered Light并把Z-prepass与Base Pass合并为Vulkan subpass,用input attachment把Tile memory控制在48 KB,可再降0.9 ms。
落地时,先在Snapdragon Profiler里看**%Time in BuildPerTileLightListJob与ALU Busy**,若>45 %就先减Tile尺寸;若带宽>4 GB/s则压Light Buffer,把spot light裁成cone data(8 Byte/light),最终让中低端机跑稳30帧。
拓展思考
- 如果项目要跑WebGL2.0(无Compute Shader),可把Tile剔除搬到CPU SIMD(Unity Burst+ISPC),1080p 32×32 Tile在骁龙680单核耗时1.2 ms,仍低于GPU Fallback;
- 对于XR应用,双眼分屏导致Tile列表重复生成,可用Single-Pass Instancing+共享Tile LightList,节省40 % CPU时间,但需把Tile memory上限从64 KB砍到32 KB,用球面光源裁剪进一步压缩;
- 当使用Vulkan Ray Query做Forward+阴影,Pixel Shader内ray query+Tile光照会撑爆Register,Adreno 730上wave32只占50 %,此时把ray query拆到Cluster级别做coalesced trace,可把ALU利用率拉回85 %,帧时间稳定2.8 ms。