# 布局渲染与优化
## CPU与GPU
> CPU:擅长各种复杂的逻辑运算,不擅长数学尤其是浮点运算。
>> Control>用于协调控制真个CPU运行,包括去除指令、控制其他模块的运行等;
>> ALU>算术逻辑单元,用于进行数学逻辑运算;
>> Cache>缓存,储存信息;
>> DRAM>RAM,储存信息;
> GPU: 为了帮助CPU分担绘制图形压力而设计出来
## Xml布局显示到屏幕的流程
Xml布局=>LayoutInflater加载进内存=>CPU计算Xml的属性信息=>处理为多维向量图形=>CPU将图形交给GPU=>GPU绘制图形
* 栅格化:将向量图形格式表示的图像转换成位图以用于显示器
CPU将UI对象转换成多维图形=>通过openGL调用GPU=>GPU对图形进行栅格化=>如果在16ms内完成则显示器直接显示/如果超过16ms则垂直同步等待下一帧完成
## FPS
> 60Hz刷新频率的由来
12fps:由于人眼的特殊生理结构,如果所看画面之帧率高于每秒约10-12帧的时候就会认为u是连贯的
24fps:有声电影的拍摄及播放帧率均为24帧,对一般人而言又算可以接受
30fps:早期的高动态电子游戏,帧率小于30帧/秒的话会显得不连贯,这是因为没有动态模糊是流畅度降低
60fps:在与手机交互过程中,如果触摸和反馈60帧以下是忍能感觉出来的。60帧以上不能察觉变化
Android系统每隔16ms发出VSYNC信号(1000ms/60≈16ms),触发对UI进行渲染,如果每次渲染都成功这样就能够达到流畅的画面所需要的60fps,
为了能够实现60fps,计算渲染的大多数操作都必须在16ms内完成
## 卡顿原理分析
> 当一帧画面渲染时间超过16ms的时候,处置同步机制会让显示器硬件等待GPU完成栅格化渲染操作
这样会让这一帧画面多停留了16ms甚至更对,这样就造成了用户看起来画面停顿
1. 16ms主要被两件事占用
+ 将UI对象转换成多边形和纹理
+ CPU传递数据到GPU,GPU进行绘制
2. 如何减少这两部分时间
+ CPU减少xml转换成对象的时间(层级不要太深)
+ GPU减少重复绘制
## 过度绘制
> 1. GPU根据CPU传递的指令来进行绘制,CPU让GPU画什么GPU就画什么,16ms画一次;
这样就造成有些图像被其他图像覆盖,底下以及上面的图象都要绘制,造成没有必要的浪费。
> 2. 过度绘制的几种情况:
+ 布局层级太深,用户看不到的区域也会被绘制
+ 自定义控件中,onDraw方法醉了过多的绘制
## 过度绘制查看工具
> 在手机的开发者选项中=>调试GPU过度绘制
+ 蓝色: 过度绘制一次 无过度绘制
+ 淡绿: 过度绘制2次
+ 淡红: 过度绘制3次
+ 深红: 过度绘制4次
## 优化
1. 不重复设置背景色()
2. 裁剪被遮挡的图片()
## 总结
> + 布局中的背景是否有必要
> + 是否可以删除多余布局
> + 自定义View是否进行了裁剪
> + 布局是否足够扁平化
一键复制
编辑
Web IDE
原始数据
按行查看
历史