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() 操作;

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

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

 

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值