Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-12-12:谈一谈屏幕刷新机制?

MoJieBlog opened this issue · comments

屏幕刷新频率和绘制频率
cpu 负责 measure layout draw => displayList
gpu 负责 display => 位图
每个16ms会发送一次垂直同步信号 vsync
每次信号发送的时候都会从gpu的buffer中取出渲染好的位图 显示在屏幕上
同时如果有需要 还会进行下一次的 cpu计算,计算好后放入buffer中

如果计算时间超过了两次vsync之间的时间 即16ms 则 vsync信号会把 上一次gpu buffer中的信息展示出来 这时候就是卡顿

另外如果页面没有变化 屏幕还是一样会去buffer中取出上一次的刷新,只不过cpu不再去计算而已

1.丢帧(掉帧) ,是说 这一帧延迟显示 还是丢弃不再显示 ?
答:延迟显示,因为缓存交换的时机只能等下一个VSync了。
2. 布局层级较多/主线程耗时 是如何造成 丢帧的呢?
答:布局层级较多/主线程耗时 会影响CPU/GPU的执行时间,大于16.6ms时只能等下一个VSync了。
3. 16.6ms刷新一次 是啥意思?是每16.6ms都走一次 measure/layout/draw ?
答:屏幕的固定刷新频率是60Hz,即16.6ms。不是每16.6ms都走一次 measure/layout/draw,而是有绘制任务才会走,并且绘制时间间隔是取决于布局复杂度及主线程耗时。
4. measure/layout/draw 走完,界面就立刻刷新了吗?
答:不是。measure/layout/draw 走完后 会在VSync到来时进行缓存交换和刷新。
5. 如果界面没动静止了,还会刷新吗?
答:屏幕会固定没16.6ms刷新,但CPU/GPU不走绘制流程。见下面的SysTrace图。
6. 可能你知道VSYNC,这个具体指啥?在屏幕刷新中如何工作的?
答:当扫描完一个屏幕后,设备需要重新回到第一行以进入下一次的循环,此时会出现的vertical sync pulse(垂直同步脉冲)来保证双缓冲在最佳时间点才进行交换。并且Android4.1后 CPU/GPU的绘制是在VSYNC到来时开始。
7. 可能你还听过屏幕刷新使用 双缓存、三缓存,这又是啥意思呢?
答:双缓存是Back buffer、Frame buffer,用于解决画面撕裂。三缓存增加一个Back buffer,用于减少Jank。
8. 可能你还听过神秘的Choreographer,这又是干啥的?
答:用于实现——"CPU/GPU的绘制是在VSYNC到来时开始"。

Android屏幕刷新机制