Android屏幕刷新机制

屏幕刷新与绘制机制
本文深入探讨了APP界面刷新机制,解析了CPU、GPU与Display的并行工作原理,以及APP如何响应屏幕刷新信号(VSync)进行画面切换。特别介绍了ViewRootImpl在屏幕绘制中的作用,包括遍历View树、事件分发、屏幕焦点处理等关键过程。

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 (献上膝盖)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值