一. 过度绘制
1. 什么是过度绘制
一个像素绘制超过一次。
2. 追踪过度绘制
Android手机的开发者模式有一个Show GPU Overdraw工具。
- 蓝色:1×过度绘制。
- 绿色:2×过度绘制。
- 浅红色:3×过度绘制。
- 深红色:4×过度绘制。
3. 优化过度绘制
降低View层级:
- LinearLayout VS RelativeLayout
- merge
不必要的背景:
- 去掉window的背景
- 去掉布局中不必要的背景。
ClipRect & QuickReject
ViewStub
.9图用作背景
二.UI卡顿
1.帧率
Frame Rate,单位fps,是指GPU生成帧的速率,越高越好。
2. 屏幕刷新率
Refresh Rate,单位HZ,是指设备刷新屏幕的频率,对于特定设备来说是个常量,如60HZ。
3. VSync的作用
① 没有引入VSync时,屏幕显示图像的工作流程。
如上图,CPU/GPU 向 Buffer 中生成图像,屏幕从 Buffer 中取图像、刷新后显示。这是一个典型的生产者——消费者模型。
理想的情况是帧率和刷新频率相等,每绘制一帧,屏幕显示一帧。而实际情况是,二者之间没有必然的大小关系,如果没有锁来控制同步,很容易出现问题。例如,当帧率大于刷新频率,当屏幕还没有刷新第 n-1 帧的时候,GPU 已经在生成第 n 帧了,从上往下开始覆盖第 n-1 帧的数据,当屏幕开始刷新第 n-1 帧的时候,Buffer 中的数据上半部分是第 n 帧数据,而下半部分是第 n-1 帧的数据,显示出来的图像就会出现上半部分和下半部分明显偏差的现象,我们称之为 “tearing”。
② 双重缓存
为了解决单缓存的“tearing”问题,双重缓存和 VSync 应运而生。
工作流程这样的:
在某个时间点,一个屏幕刷新周期完成,进入短暂的刷新空白期。此时,VSync 信号产生,先完成复制操作,然后通知 CPU/GPU 绘制下一帧图像。复制操作完成后屏幕开始下一个刷新周期,即将刚复制到 Frame Buffer 的数据显示到屏幕上。
在这种模型下,只有当 VSync 信号产生时,CPU/GPU 才会开始绘制。这样,当帧率大于刷新频率时,帧率就会被迫跟刷新频率保持同步,从而避免“tearing”现象。
③ 三重缓存
略
4. 避免UI卡顿
- 避免onDraw中创建对象,对象池。
- 减少View层级
- 避免在UI顶层使用ReleativeLayout,measure两次
- 自定义View控制绘制的复杂度