Android-Daily-Interview icon indicating copy to clipboard operation
Android-Daily-Interview copied to clipboard

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

Open MoJieBlog opened this issue 5 years ago • 2 comments

MoJieBlog avatar Dec 12 '19 01:12 MoJieBlog

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

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

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

manondidi avatar Jan 21 '20 09:01 manondidi

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屏幕刷新机制

senlinxuefeng avatar Jan 13 '22 10:01 senlinxuefeng