TaskPerFrame
16ms 内都需要完成什么?
from : https://juejin.cn/post/7062552765117136903
// Vsync顶层
Vsync 调度:硬件每隔16.6ms发出硬件Vsync信号,需要经过软件调度,类似注册,才能收到回调
消息调度:主要是 doframe 的消息调度,如果消息被阻塞,会直接造成卡顿;
input 处理:触摸事件的处理;
动画处理:animator 动画执行和渲染;
view 处理:主要是 view 相关的遍历和三大流程;
measure、layout、draw:view 三大流程的执行;
//Vsync底层
DisplayList 更新:view 硬件加速后的 draw op;
OpenGL 指令转换:canvas指令转换为 OpenGL 指令;
指令 buffer 交换:OpenGL 的指令交换到 GPU 内部执行;
GPU 处理:GPU 对数据的处理过程;
layer 合成:surface buffer 合成屏幕显示 buffer 的流程;
光栅化:将矢量图转换为位图;
Display:显示控制;
buffer 切换:切换屏幕显示的帧 buffer;
Google 将这个过程划分为:其他时间/VSync 延迟、输入处理、动画、测量/布局、绘制、同步和上传、命令问题、交换缓冲区。也就是我们常用的 GPU 严格模式,其实道理是一样的。到这里,我们也就回答出来了第二个问题:
准确地说,这里仍可以进一步细化:16ms 内完成 APP 侧数据的生产;16ms 内完成 sf layer 的合成
View 的视觉效果正是通过这一整条复杂的链路一步步展示出来的,有了这个前提,那就可以得出一个结论:上述任意链路发生卡顿,均会造成卡顿。
*常见问题:
红色(Command Issue):太多display lists
浅蓝色(upload):加载了大量图形(bitmap, graphics)
深蓝色(Draw):大概率在onDraw中执行了有点耗时的任务
最浅的绿色(测绘):需要排查view树层级 view hierarchy 过深
浅绿色(处理输入和动画):需要排查滚动中的view Binding,如RV 的onBindViewHolder
深绿色(延迟VSync):直接在主线程中执行了耗时任务
TaskPerFrame