Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
MoJieBlog opened this issue Dec 12, 2019 · 2 comments
Open

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

MoJieBlog opened this issue Dec 12, 2019 · 2 comments

Comments

@MoJieBlog
Copy link
Collaborator

No description provided.

@manondidi
Copy link

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

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

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

@senlinxuefeng
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants