相关视频:Android性能优化之布局优化
一、基本知识:
- 刷新率(Refresh Rate):指在一秒内刷新屏幕的次数,例如60HZ。
- 帧率(Frame Rate):之GPU在一秒内操作画面的帧数,例如30fps,60fps。
二、UI刷新过程:
在一个典型的显示系统中,一般包括CPU、GPU和display三个部分;
display可以理解为屏幕或者显示器,CPU是用来计算图像数据的,然后把计算好的数据交给GPU,GPU会对图形数据进行渲染,再把渲染好的数据存到buffer(缓存区)里面,最后display也就是屏幕负责把buffer里面的数据呈现出来。
显示过程简单来说,就是CPU和GPU定时准备好数据放入buffer,而display会每隔一段时间从buffer读取数据进行展示。但是呢,这只是理想状态。在现实操作中,刷新率和帧率并不总是保持一致,也就是说GPU存入数据的时间和display读取的时间是不一致的。针对这个情况,android系统引入了VSYNC机制,即垂直同步,我们可以理解为帧同步。它是为了让GPU生成帧的速度和display刷新的速度保持一致。android系统会每16ms发送一次VSYNC的信号,去触发UI渲染更新,display只有收到VSYNC信号后,才会执行画面绘制。而VSYNC信号最重要的作用就是防止出现画面撕裂的情况,所谓画面撕裂,就是指一个画面上出现了两帧画面的内容,我们来看一下画面撕裂的实例:
为什么出现这种情况呢,一般都是显卡输出帧的速度高于显示器刷新帧的速度,从而导致显示器并不能及时处理需要显示的帧,最终出现了多个帧留在显示器上的问题,画面撕裂也就是帧率超过刷新率的情况,如下图所示:
其实,android中碰到更多的是情况是GPU刷新帧率的速度小于display刷新率的情况,如下图:
三、布局的选择:
- FrameLayout能实现的优先使用FrameLayout;
- 其次,优先使用RelativeLayout,它可以在不嵌套的情况下完成复杂的布局,在这一点上由于LinearLayout;
- 当在不嵌套的情况下,RelativeLayout和LinearLayout能够同时满足需求时,优先选择LinearLayout,因为RelativeLayout相对复杂,同时会存在重复绘制的情况,
- 避免OverDraw,OverDraw:是指屏幕上某一个像素点在同一帧的时间绘制了多次。