原文地址
https://mp.weixin.qq.com/s/vJAonOhW79d9VXzvQlm1Gg
![](https://img.haomeiwen.com/i2554175/750e491254e3e4ad.png)
Choreographer [ˌkɔːriˈɑːɡrəfər]
主要涉及view的绘制流程
『View.invalidate() 的整个流程就走通了。总结一下:
从 View.invalidate() 开始,最后会递归调用 parent.invalidateChildInParent() 方法。这里最顶层的 parent 是 ViewRootImpl 。ViewRootImpl 是 DecorView 的 parent,这个赋值调用链是这样的 ActivityThread.handleResumeActivity -> WindowManagerImpl.addView() -> WindowManagerGlobal.addView() -> ViewRootImpl.setView() -> View.assignParent() 。
ViewRootImpl.invalidateChildInParent() 最终调用到 scheduleTraversals() 方法,其中建立同步屏障之后,通过 Choreographer.postCallback() 方法提交了任务 mTraversalRunnable,这个任务就是负责 View 的测量,布局,绘制。
Choreographer.postCallback() 方法通过 DisplayEventReceiver.nativeScheduleVsync() 方法向系统底层注册了下一次 vsync 信号的监听。当下一次 vsync 来临时,系统会回调其 dispatchVsync() 方法,最终回调 FrameDisplayEventReceiver.onVsync() 方法。
FrameDisplayEventReceiver.onVsync() 方法中取出之前提交的 mTraversalRunnable 并执行。这样就完成了整个绘制流程。』
那么监控fps的重点
就是Choreographer的FrameCallback ,其doFrame监听了vsync信号,那么新建一个
callback继承Choreographer.FrameCallBack
再由
Choreographer.getInstance().postFrameCallback(callback)
Choreographer.getInstance().removeFrameCallback(callback)
![](https://img.haomeiwen.com/i2554175/9e89d3bbf329220c.png)
网友评论