概念
- 硬件
- CPU:三大绘制流程中Surface的计算。
- GPU:以SurfaceFlinger服务的形式工作,将CPU计算好的Surface数据合成后放到buffer中,让显示器进行读取
- 屏幕刷新率:屏幕在1s内去buffer中取数据的次数,单位为HZ。主流屏幕刷新频率是每秒60次,高的有90,120等。
- 软件
- 60 fps 的意思是说,画面每秒更新 60 次,也就是 16.67 ms 刷新一次
- FPS 则是由 Vsync 来控制的,Vsync 是通过 Choreographer 来控制应用刷新的频率的。
- 每隔 16.6 ms,Vsync 信号到来唤醒 Choreographer 来做 App 的绘制操作。
- Vsync 信号到来的时候,Choreographer 借助 Message 机制开始一帧的绘制工作
用户感知
- 卡顿:如果主线程 + 渲染线程每一帧的执行都超过 16.6ms(60fps 的情况下),那么就可能会出现掉帧、丢帧。如果是APP端没有及时渲染,而BufferQueue中还有未消费的缓冲,可能就不会有掉帧现象。
- 画面撕裂:帧率和屏幕刷新率的不一致导致的,不会丢失。
- ANR:如果界面线程被阻塞超过几秒钟时间(根据组件不同 , 这里的阈值也不同),用户会看到 “应用无响应” (ANR) 对话框(部分厂商屏蔽了这个弹框,会直接 Crash 到桌面)
刷新机制
- Android 4.1加入垂直同步技术(VSYNC),以及三重缓冲技术(Triple Buffer)
- VSync(垂直同步信号)(Vsync-App Vsync-SF lockAsync)
- 硬件屏幕保持固定频率会发出的一个脉冲信号
- 提醒CPU立即进入屏幕绘制过程;提醒GPU进行buffer的交换
- Vsync-SF:将所有准备好的 Buffer 取出进行合成
- Triple Buffer
- 一个用于GPU的合成,一个用于屏幕的刷新,一个在Jank时最大限度避免CPU空闲。Jank可能掉帧。
- 会有前后交换buffer,没有准备好的情况Jank。此时,需要第三个buffer最大限度避免CPU空闲的情况。