当滑动发生时,系统会以固定节奏尝试绘制下一帧;任何一次绘制间隔明显拉长,用户都会感知为“卡了一下”或“抖动”。这些瞬时的长帧就是“丢帧”的来源。滑动场景对节奏变化最敏感,因为视觉上背景、文本与图片在持续位移,一旦节拍不稳,人眼会立即察觉。
线下 Trace 的目标是:还原滑动交互的帧时序,把“哪一段丢帧”与“为何丢帧”连接起来,给出直接可改的点位。Trace 的抓取请参考 录制 Trace,注意确保覆盖滑动交互的完整时间窗以及页面滑动速度。
在 Trace 网页中的 Choreographer#doFrame 执行起点处增加了帧渲染耗时标签(目前仅支持 Android 端)。这些标签用于显示整个系统渲染过程中的丢帧情况,通过观察这些标签可以直观识别渲染过程中的渲染耗时异常。帧的渲染耗时是通过累加 UI 线程中的 Choreographer#doFrame 和 RenderThread 线程中的 DrawFrames 的耗时来计算的。如果总耗时大 于或等于 32 毫秒,标签将显示为红色;如果总耗时大于或等于 16 毫秒且小于 32 毫秒,标签显示为橘黄色;如果总耗时小于 16 毫秒,标签则为绿色。线下分析时我们可以认为红色标签和黄色标签对应的任务是导致丢帧的任务重点分析。
Canvas 绘制复杂。症状是单帧计算时间异常拉长,且随滚动重复出现。GPU 或 RenderThread 队列积压,与图片尺寸或数量相关。