FRAME LAB

Android 渲染流水线仿真

从一次 doFrame,到真正上屏。

Frame timeline

离散事件仿真 · 预热 1 s,统计随后 3 s · 所有耗时单位 ms
● 仿真已完成
新帧呈现率——
GPU 活跃时间占比—至少一个 GPU 任务执行中的时间占比
平均流水线延迟—App 开始 → 新帧 physical present
1000.0 ms参数与同名轨道联动 · 点击轨道名称定位参数
同帧同色 · 圆点常驻高亮 · 实心已到达 / 空心待执行切片均带 #帧号 · 等待以斜纹显示 · 重复刷新以 Repeat 标识全部帧
同一帧以相同颜色和 #帧号贯穿整条链路;点击切片高亮该帧,再点击“清除帧高亮”恢复。竖线为物理 VSync;L! 表示 latch 时 acquire fence 尚未 signal。
显示器物理刷新率新帧 FPS重复刷新占比平均延迟提前 latch 次数
仿真机制、范围与 AOSP 参考

本工具是可解释的教学 / 参数实验模型,不是 Android 调度器或具体设备的性能预测器。固定工作耗时;一个持续更新的 App;App CPU 串行,SF CPU 串行,GPU 按无限并行能力建模,App 渲染与合成不发生资源争用,但仍保留各自执行耗时。CPU 结束即提交 buffer 和 acquire fence,GPU 完成时 signal。CPU / GPU 可以跨帧并行。

每个 App 使用可调的抽象 buffer 槽位(默认 3 个,范围 2~8),正在显示的 buffer 占一槽,旧显示 buffer 在下一帧上屏时释放;CPU 工作结束后尝试取得 buffer;槽位满时等待 dequeueBuffer,旧 buffer 释放后立即继续提交 GPU,而非跳过整帧。等待会阻塞后续 App 工作(未独立建模 UI / RenderThread)。SF 每轮选择最早可消费的 queued buffer,不模拟所有 BLAST 事务与丢帧策略。Disabled 在 latch 前检查 fence;Always 允许提前 latch;Auto 仅在勾选简单更新、非 early、HWC 路径且当前 SF 轮次恰有一个候选屏时允许提前 latch。这是对条件的保守近似,不宣称逐行复现某一 Android 分支。

提前 latch 不等于提前完成:GPU 合成必须等 acquire fence,但不与 App 争用 GPU 执行资源;HWC 消费同样需等 acquire fence。合成和 HWC 准备完成后,在下一次可用的物理 VSync 更新画面,否则重复旧内容。未模拟 scanout、真实驱动 present fence 延迟、GPU 抢占、DVFS、带宽争用、预测误差、动态 work duration 或真实 FrameTimeline jank 分类。当前页面仅模拟一个物理屏幕。

相位为相对物理 VSync 的有符号 ms 偏移,负值表示提前。周期性相位在本模型中按周期归一化;不用于表达 Android 的跨周期目标 vsyncId。延迟从 App CPU 开始计算,不等同于触摸延迟。统计 FPS = [1000,4000) 内新帧 present 数 / 3 s;重复率不是 Android jank rate。

参考:VSync · Unsignaled buffer latching · HWC · Synchronization