面对 UI 卡顿,如何入手分析解决问题?
https://kaiwu.lagou.com/course/courseInfo.htm?courseId=67#/detail/pc?id=1881
Choreographer小结
Choreographer 是一个承上启下的角色。
承上:接收应用层的各种 callback 输入,包括 input、animation、traversal 绘制。但是这些 callback 并不会被立即执行。而是会缓存在 Choreographer 中的 CallbackQueue 中。
启下:内部的 FrameDisplayEventReceiver 负责接收硬件层发成的 vsync 信号。当接收到 vsync 信号之后,会调用 onVsync 方法 -> doFrame -> doCallbacks,在 doCallbacks 中从 CallbackQueue 中取出进行绘制的 TraversalRunnable,并调用其 run 方法进行绘制。
通过这样一套机制,保证软件层和屏幕刷新处于同一频率,使 Android App 可以以一个比较稳定的帧率运行,减少因为频率波动造成“丢帧”的概率。
利用 Choreographer 实现帧渲染监控
Choreographer 会在 doFrame 方法中回调各种 callback,其中包括绘制 View 的 TraversalRunnable。
Choreographer 向外部提供了 FrameCallback 接口,来监听 doFrame 方法的执行过程。
这个接口中的 doFrame 方法会在绘制每一帧时被调用,所以我们可以在 App 层主动向 Choreographer 中添加 Callback,然后通过检测两次 doFrame 方法执行的时间间隔来判断是否发生“丢帧”。
每一次订阅都只会接收一次 vsync 信号,而我们需要一直监听 doFrame 的回调,因此在方法最后需要递归的执行 postFrameCallback 方法。