说一说android屏幕刷新那些事

在面试问到你的应用程序是否卡顿,如何处理卡顿的,相信大家都会说,不要在主线程处理耗时操作,以及优化层次布局等。其实这个答案没错,但是却是有点空洞,面试官更想知道的应该是为什么在主线程耗时操作和布局太复杂会造成会造成卡顿。
这里先解释一下屏幕刷新的几个概念,CPU,GPU和屏幕
CPU:执行应用层的measure、layout和draw等操作,将绘制完成之后的操作提交给GPU。
GPU:会将CPU提供的数据,进一步处理,并将数据进行缓存。
屏幕:由一个个像素点组成,根据固定频率(60HZ)从GPU里面获取缓存数据填充到像素点上。

为什么不能有深层嵌套和复杂的draw
GPU里面的缓存也是包括两个部分的一个是Back Buffer一个是Frame Buffer 使用双缓冲机制,GPU只会往Back Buffer里面写入数据,从Frame Buffer里面将缓存数据刷新到屏幕上,每到一个固定频率 Back Buffer 和Frame Buffer角色互换。在CPU比较差或者绘制逻辑比较复杂,不能够保证在16.6毫秒完成绘制,当应用正在往Back Buffer写数据的时候,会为Back Buffer加锁,当刷新时间到了的时候会放弃此时buffer交换。

下面说一下为什么不能在主线程的耗时操作会导致页面卡顿。
在Android 4.1之前没有引入choreographer ,虽然绘制不是很复杂,消耗的时间也不长,但是下一次vsync信号马上就好到了,所以还是存在丢帧的情况,因此在Android 4.1之后引入了choreographer这个类,这个类会缓存本次的绘制请求,并且通过JNI请求下一个vsync信号,vsync是SurfaceFiling实现的,当VSYNC信号来临时会通过handler发送一个异步消息,到Message Queue队列当中,如果此时主线程一直在做耗时操作导致,Message 消息一直得不到处理,就不会走后面的从Choreographer绘制流程的逻辑(从Choreographer缓存队列里面取出绘制请求),如果等异步消息执行完之后在执行绘制相关操作自然会卡顿掉帧,在这个过程中,为了让绘制操作消息级别提高用到了消息屏障,消息屏障只会处理异步消息,如果没有异步消息就会handler消息就会睡眠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值