Android屏幕刷新机制

CPU、GPU 跟 Display是可以并行工作的。通常我们写的APP代码只是控制CPU的计算工作,而底层在每一次屏幕刷新信号(VSync)来的时候都会去切换这一帧的画面,这点我们是控制不了的,是底层的工作机制。

当APP界面没有必要再刷新时,这个时候APP是接收不到屏幕刷新信号的,所以也就不会让 CPU 去计算下一帧画面数据,但是底层仍然会以固定的频率(当前手机基本为60Hz,1000/60=16.67ms一次)来切换每一帧的画面,只是它后面切换的每一帧画面都一样,所以给我们的感觉就是屏幕没刷新。

当APP需要重新绘制时,通过ViewRootImpl 中的 scheduleTraversals() 里来安排一次遍历绘制 View 树的任务(同时设置同步消息的屏障(也是一个Message放入MessageQueue),以保障View绘制任务在Vsync信号到来的第一时间优先执行,此时Looper.loop()在messageQueue.next()方法处阻塞,主线程处于空闲状态),

通过发送异步消息注册监听下一次VSync信号的事件

底层就会回调 Choreographer 的onVsync() 方法来通知上层 app,onVsync() 方法被回调时,会往主线程的消息队列中发送一个执行 doFrame() 方法的消息,这个消息是异步消息,所以不会被同步屏障拦截住;doFrame() 方法会去取出之前放进待执行队列里的任务来执行,取出来的这个任务实际上是 ViewRootImpl 的 doTraversal() 操作;

Android屏幕刷新机制_第1张图片

所有需要遍历view的事件都是从ViewRootImpl 开始的,比如事件分发,屏幕焦点,输入法事件,view的测量、布局、绘制等。

ViewRootImpl 在Activity创建的时候和DecorView绑定。

 

 

参考:https://www.jianshu.com/p/0d00cb85fdf3 (献上膝盖)

你可能感兴趣的:(Android)