2
3
7
新手上路
1.Framework源码面试:1.Activity启动流程 2.Framework源码面试:2.Binder面试 3.Framework源码面试:3.Handler面试 4.Framework源码面试:4.事件分发机制 5.Framework源码面试:5.onMeasure测量原理 6.Framework源码面试:6.Android屏幕刷新机制
讲解面试之前,先理解下什么是刷新机制,他的原理是什么
display读取的频率是固定的,比如每个16ms读一次,但是CPU/GPU写数据是完全无规律的。
友情提示:在咱们的开发过程中应该接触不到 GPU、display 这些层面的东西,所以我把这部分工作都称作底层的工作了,下文出现的底层指的就是除了 CPU 计算屏幕数据之外的工作。
也就是说,我们常说的 Android 每隔 16.6ms 刷新一次屏幕其实是指:底层以固定的频率,比如每 16.6ms 将 buffer 里的屏幕数据显示出来。
我们常说的 Android 每隔 16.6 ms 刷新一次屏幕其实是指底层会以这个固定频率来切换每一帧的画面。
这个每一帧的画面也就是我们的 app 绘制视图树(View 树)计算而来的,这个工作是交由 CPU 处理,耗时的长短取决于我们写的代码:布局复不复杂,层次深不深,同一帧内刷新的 View 的数量多不多。
CPU 绘制视图树来计算下一帧画面数据的工作是在屏幕刷新信号来的时候才开始工作的,而当这个工作处理完毕后,也就是下一帧的画面数据已经全部计算完毕,也不会马上显示到屏幕上,而是会等下一个屏幕刷新信号来的时候再交由底层将计算完毕的屏幕画面数据显示出来。
当我们的 app 界面不需要刷新时(用户无操作,界面无动画),app 就接收不到屏幕刷新信号所以也就不会让 CPU 再去绘制视图树计算画面数据工作,但是底层仍然会每隔 16.6 ms 切换下一帧的画面,只是这个下一帧画面一直是相同的内容。
Android系统每隔16ms会发出VSYNC信号重绘我们的界面(Activity)。 为什么是16ms:因为Android设定的刷新率是60FPS(Frame Per Second),也就是每秒60帧的刷新率, 约16ms刷新一次。这就意味着,,我们需要在16ms内完成下一次要刷新的界面的相关运算,,以便界面刷新更新。 举个例子,当运算需要24ms完成时,16ms时就无法正常刷新了,而需要等到32ms时刷新,这就是丢帧了。丢帧越多,给用户的感觉就越卡顿。
使用道具 举报
0
5
1
本版积分规则 发表回复 回帖后跳转到最后一页
Archiver| 手机版| 小黑屋| 零维护
GMT+8, 2025-4-8 04:31 , Processed in 0.102459 second(s), 20 queries .
Powered by Discuz! X3.4
Copyright © 2020, LianLian.