CPU 与 GPU
- CPU的任务繁多,做逻辑计算外,还要做内存管理,显示操作,因此在运行的时候性能会大大折扣,在没有GPU的时代,不能显示复杂的图形,即使GPU工作频率超过了2GHz或者更高,对它绘制图形提高也不大,所以GPU就设计出来了
1. 以上图中,CPU中Control为控制器,用于协调整个CPU的运行,包括取出指令,控制其他模块的运行
2. 绿色的为ALU是算数逻辑单元,用于数据逻辑计算
3. 橙色Cache和DRAM分别为缓存和RAM,用于存储信息
* CUP的控制较为复杂,而ALU较少,因此CPU擅长处理各种复杂逻辑运算,但是不擅长数学尤其是浮点运算
复制代码
XML布局显示到屏幕流程
- LayoutInflater方法将布局加载进内存
- CPU经过计算将UI对象转换成多维图形
- 通过OPENGL调用GPU
- GPU对图形进行栅格化
- 上述步骤如果在16ms内完成直接在显示器上显示,如果完不成垂直同步等待下一帧完成
为什么16ms必须完成绘画
- 60fps 在与手机进行交互的时候,如触摸与反馈60帧以下的人是可以感应出来的,60帧以上不能感觉到变化
- 当频率地狱60帧的时候感觉画面卡顿和停滞现象
- Android系统会每隔16ms发送VSYNC信号(1000/60=16.66ms),触发对UI进行渲染,如果每次渲染都成功这样就能达到流畅的画面所需要的60fps,为了能够实现60fps,这就意味着计算机渲染大多数操作都必须再16ms内完成
过渡绘制
- CPU绘制过程是根据CPU发送的指令来的,他很傻,让他画什么就画什么,16ms就画一次,造成有些图像被其他图像进行覆盖,底下以及面上的图像都要绘制,造成了必要的浪费
- 过渡绘制的几种情况
- 布局层次太深,用户看不到的区域也会被绘制
- 自定义View中,onDraw的方法做了过多的绘制
打开开发者选项,开启过渡绘制
- 蓝色 过渡绘制一次 无过渡绘制
- 淡绿 过渡绘制两次
- 淡红 过渡绘制三次
- 深红 过渡绘制四次
这代表了4种不同程度Overdraw情况,我们的目标是尽量减少红色,Overdraw看到更多的蓝色区域
卡顿原理
- 将UI对象转换成多边形和纹理
- CPU传递数据到GPU,GPU进行绘制
减少以上两部分时间
- CPU减少xml转换成对象的时间
- CPU减少重复绘制
总结
- 性能优化看上去非常高大上,但其实就是细节决定成败,需要对原理性的东西了解清楚,每一步都有什么不一样,针对每一个步骤进行细致化的优化,性能优化是一种思想,而不是一套具体的操作方法
- 布局中的背景是否有需要(主题背景)
- 是否可以删除多余布局
- 自定义View是否进行了裁剪
- 布局是否够扁平化
谢谢大家支持
- 希望大家关注,我会不时更新
- GitHub hunimeizi