移动端 Overdraw 治理:从单帧热图到屏幕空间预算
Overdraw 不是"颜色越红越差"的截图结论。透明层、粒子、UI、植被和后处理会在不同屏幕区域重复写入像素,真实成本还取决于覆盖面积、Shader 复杂度、分辨率和带宽。本文建立可回归的屏幕空间预算。
一、为什么 DrawCall 少仍可能 GPU 很慢
一个全屏透明 Pass 可能只有少量 DrawCall,却处理数百万像素;大量小物体 DrawCall 很多,但屏幕覆盖很小。判断像素端压力必须把绘制次数和覆盖面积结合。
二、空间网格统计
将屏幕划分为固定网格,对每格记录覆盖次数、透明覆盖、估算像素成本和对应 Pass。为避免分辨率变化影响比较,使用归一化屏幕坐标,并保存原始分辨率与动态分辨率比例。
text
cell_cost = coverage × shader_weight × resolution_scale²
权重是筛选模型,不是 GPU 真实时间,应通过代表设备实测校准。
三、区分可避免和必要覆盖
基础不透明绘制、阴影、后处理与 UI 具有不同语义。预算按类别设置,不能把所有覆盖统一相加。透明特效的高覆盖可能是设计要求,但仍应检查持续时间、叠层数量和低端降级。
四、时间维度
单帧热图容易选中偶发峰值,也可能漏掉长期中度过绘。统计场景路线中的 P50、P95、峰值持续时间和高热区域驻留时间。连续数秒覆盖过高通常比一帧闪现更值得优先处理。
五、从热区回到 DrawCall
每个热区保存贡献最大的 Pass、材质和 DrawCall 列表。RenderDoc 用于验证实际渲染顺序、深度状态、混合方式和不可见绘制。热图只负责告诉你"哪里贵",截帧负责解释"谁造成"。
六、常见优化
- 缩小透明几何包围范围;
- 减少多层全屏或大面积半透明;
- 使用深度裁剪和合理排序;
- 控制粒子屏幕覆盖、生命周期和发射峰值;
- 合并重复 UI 层并限制无效刷新;
- 为低端设备设置特效覆盖和分辨率档位。
七、回归门禁
对固定相机和路径比较:高覆盖网格比例、透明层 P95、全屏 Pass 数量、热区持续时间与 GPU 像素阶段耗时。相机或分辨率配置不同则禁止直接比较。
结语
Overdraw 治理要从一张彩色截图升级为空间、时间和贡献者三维模型。只有能定位到具体 Pass 与材质,预算才真正可执行。