外观
doFrame、onDraw、Actual Timeline,哪个时刻才代表上屏?
标准回答
onDraw 结束、doFrame 结束都不能单独证明画面已经显示。它们属于应用侧的一部分工作;后面还可能有渲染线程、GPU、缓冲区交接、合成和展示。
Perfetto 的应用 Actual Timeline 描述应用完成一帧并交给合成侧的实际过程,结束点涉及 GPU 完成与帧提交时间,并不等同于屏幕实际展示时间。SurfaceFlinger 的对应帧则覆盖其处理到展示的链路。要确认上屏,应关联目标应用、图层和帧,查看对应的实际展示信息。
如果测“手指按下到画面响应”,起点应是统一口径的输入时刻,终点应是包含这次状态变化的目标帧展示时刻。不能随便选按下之后的第一条 doFrame,因为那一帧可能属于别的窗口,或根本不包含你的更新。
动画也可能只更新图层属性,不产生新的应用 buffer。查看 FrameTimeline 时要结合 Layer Name、帧关联和帧类型判断。没有采到对应数据时,应承认当前证据只能证明某个阶段完成,而不能把最接近的时间戳当作上屏。
关键机制
- 先框定操作时间窗,再找目标窗口和帧的关联,而不是按视觉上最近的两条切片相减。
- Expected 与 Actual 对照用于判断是否错过预期时机,继续看 Jank Type 和线程状态定位责任段。
- Trace 名称中的编号可能是帧或 VSync 标识;耗时看 Duration 和单位,不能把 doFrame 后面的数字直接当毫秒。
通俗例子
业务状态在 10ms 更新,doFrame 在 14ms 结束,而目标帧到 28ms 才展示。若起点为 0ms 的输入,响应是 28ms,不是 14ms。这些数字仅用于说明口径。
追问与回答
应用 Actual Timeline 的结束就是 Actual Present 吗?
不是。应用轨道主要反映应用产帧到提交及 GPU 完成相关时刻;实际展示还需关联到显示侧。首先确认字段属于哪条轨道、哪个窗口和哪一帧,再解释其含义,不能因为都带 Actual 就当成同一个终点。
易混淆点
不同系统、采集配置和工具版本可见字段不同;显示堆栈的展示时间也不等于逐像素光学测量结果。
参考资料
内容来源
- Android 技术札记 · 原条目
frame-present