笔记内容来源
1.Android性能优化之渲染篇
1.VSYNC
- 帧率:GPU在1秒内绘制操作的帧数.如60fps.
- 我们通常都会提到60fps与16ms,这是因为人眼与大脑之间的协作无法感知超过60fps的画面更新.
- 开发app的性能目标就是保持60fps,这意味着每一帧只有16ms=1000/60的时间来处理所有的任务
- 刷新率:屏幕在1秒内刷新屏幕的次数.如60Hz,每16ms刷新1次屏幕.
- GPU获取图形数据进行渲染,然后屏幕将渲染后的内容展示在屏幕上.
- 大多数手机屏幕的刷新率是60Hz,如果GPU渲染1帧的时间低于1000/60=16ms,那么在屏幕刷新时候都有最新帧可显示.如果GPU渲染某1帧 f 的时间超过16ms,在屏幕刷新时候,f并没有被GPU渲染完成则无法展示,屏幕只能继续展示f的上1帧的内容.这就是掉帧,造成了UI界面的卡顿.
下面展示了帧率正常和帧率低于刷新率(掉帧)的情形
2.GPU渲染:GPU渲染依赖2个组件:CPU和GPU
- CPU负责Measure,Layout,Record,Execute操作.
- GPU负责Rasterization(栅格化)操作.
- Resterization栅格化是绘制那些Button,Shape,Path,String,Bitmap等组件最基础的操作.它把组件拆分到不同的像素上进行显示.这是一个很费时的操作.
- CPU负责把UI组件计算成Polygons(多边形),Texture(纹理),然后交给GPU进行栅格化渲染.
- 为了App流畅,我们需要确保在16ms内完成所有CPU和GPU的工作.
3.过度绘制
Overdraw过度绘制是指屏幕上的某个像素在同一帧的时间内被绘制了多次.过度绘制会大量浪费CPU及GPU资源/占用CPU和GPU的处理时间
- 过度绘制的原因
- UI布局存在大量重叠
- 非必须的背景重叠.
- 如Activity有背景,Layout又有背景,子View又有背景.仅仅移除非必要背景就可以显著提升性能.
- 子View在onDraw中存在重叠部分绘制的情况,比如Bitmap重叠绘制