屏幕刷新频率
多数手机屏幕刷新的频率是60hz,也就是1000/60=16.67(大约), 若在16.67ms内没有执行完这一帧, 就会出现丢帧现象,
当丢帧严重的时候就会出现我们肉眼看到的画面卡顿。
布局渲染到屏幕过程
先看几个概念:
- 格栅化:将控件、文字等拆分成不同像素,在屏幕上显示。由于格栅化比较复杂,所以这一操作比较耗时。
- CPU:用来将控件处理成多边形或则纹理。
- GPU:用来处理图像。
- OpenGL ES:用来绘制图形。
渲染过程:
控件->经过CPU处理转化为多边形或则纹理->传给GPU格栅化->屏幕。
注意:上传GPU后的数据,会被保存,下次绘制的时候,直接告诉OpenGL ES怎么绘制就行了。
如下图(官方盗图):
过度绘制
屏幕上的一个像素绘制多次,如:带有背景色的TextView,就会绘制两次,一次是文本,一次是背景。
过度绘制的原因
- 复杂的布局层级
- 背景色重叠
检测工具
- **Hierachy Viewer:可以查看view的层级,包括各层级的meausre、layout、draw三个阶段的时间。
- **调试GPU过度绘制:蓝-绿-淡红-红,最好控制在绿或则蓝,
想在开发中不存在颜色?不存在的,这辈子都不可能,不信你看看google自己的应用,哈哈哈~ - **Lint工具:帮你检测不合理的布局,代码优化。
避免过度绘制方法
- 移除默认的window背景
- 移除布局、控件非必要的背景
- 按需加载占位图
- 动态加载布局
- 减少布局层次
- 自定义View时候,被遮盖的布局不要绘制,Canvas.clipRect()剪切
你说?还有include、viewstub、merge标签?教程太多。。。