TaskPerFrame

16ms 内都需要完成什么

from : https://juejin.cn/post/7062552765117136903

图片

// Vsync顶层

  1. Vsync 调度:硬件每隔16.6ms发出硬件Vsync信号,需要经过软件调度,类似注册,才能收到回调

  2. 消息调度:主要是 doframe 的消息调度,如果消息被阻塞,会直接造成卡顿;

  3. input 处理:触摸事件的处理;

  4. 动画处理:animator 动画执行和渲染;

  5. view 处理:主要是 view 相关的遍历和三大流程;

  6. measure、layout、draw:view 三大流程的执行;

    //Vsync底层

  7. DisplayList 更新:view 硬件加速后的 draw op;

  8. OpenGL 指令转换:canvas指令转换为 OpenGL 指令;

  9. 指令 buffer 交换:OpenGL 的指令交换到 GPU 内部执行;

  10. GPU 处理:GPU 对数据的处理过程;

  11. layer 合成:surface buffer 合成屏幕显示 buffer 的流程;

  12. 光栅化:将矢量图转换为位图;

  13. Display:显示控制;

  14. buffer 切换:切换屏幕显示的帧 buffer;

Google 将这个过程划分为:其他时间/VSync 延迟、输入处理、动画、测量/布局、绘制、同步和上传、命令问题、交换缓冲区。也就是我们常用的 GPU 严格模式,其实道理是一样的。到这里,我们也就回答出来了第二个问题:

准确地说,这里仍可以进一步细化:16ms 内完成 APP 侧数据的生产;16ms 内完成 sf layer 的合成

image-20220310164850814

View 的视觉效果正是通过这一整条复杂的链路一步步展示出来的,有了这个前提,那就可以得出一个结论:上述任意链路发生卡顿,均会造成卡顿

*常见问题:

红色(Command Issue):太多display lists

浅蓝色(upload):加载了大量图形(bitmap, graphics)

深蓝色(Draw):大概率在onDraw中执行了有点耗时的任务

最浅的绿色(测绘):需要排查view树层级 view hierarchy 过深

浅绿色(处理输入和动画):需要排查滚动中的view Binding,如RV 的onBindViewHolder

深绿色(延迟VSync):直接在主线程中执行了耗时任务

 

Author

white crow

Posted on

2022-03-16

Updated on

2024-03-25

Licensed under