CPU/GPU
CPU作为“中央处理器”,除了要负责逻辑计算外,还需要做内存管理,显示操作,因此随着各种复杂App的出现,其实际运输的性能会大打折扣。
设计原由:为了提高图形显示小路以及复杂的图形,设计出了GPU.
主要功能:为了帮助CPU分担图形显示
XML 布局显示至屏幕流程
<TextView width="">
|
LayoutInflater加载进内存
|
CPU计算,处理成位图
|
CPU将图形交给GPU
|
GPU对图形进行删格化
|
显示器显示
FPS
12fps:画面帧数高于每秒约10~12帧时,眼睛会认为它是连贯的;
24fps:有声电影拍摄一般为每秒24帧
30fps:早期动态电子游戏,一般会在每秒30帧左右;
60fps:手机交互过程中,需要触摸和反馈,需要60帧才能达到不卡顿的效果。
所以16ms没有绘制出一帧就会感觉到卡顿。
布局加载流程
setContentView
|
LayoutInflater(inflate)
|
XmlResourceParser(getLayout)
|
infalte
|
ceateViewFromTag
|
tryCreateView
|
createView
|
View
如何优化
- CPU减少xml转换成对象的时间
- GPU减少重复绘制
过度绘制概念
GPU每隔16ms画一次,如果CPU传递过来的图形又重复的位置,会造成用户只能看到顶层画面,而底层画面则被遮盖,底层部分的绘制虽然用户无法看到,但同样也占据了计算资源,造成了不必要的浪费;这种情况角过度绘制;
过度绘制查看工具
在开发者选项中 “调试GPU过度绘制”
过度绘制的优化
减少布局层级
- 布局中的背景是否需要;
- 是否可以删除多余布局;
- 自定义View是否进行了相应的裁剪;
- 布局是否够扁平化;
- 使用Merge标签排除多余一层ViewGroup容器
- 使用ViewStub进行布局的懒加载
布局加载优化方式
采用java代码加载
- XML由于有IO操作与反射操作导致加载耗时
- 采用Java方式构造布局
- 代码量大,不容实现,不容易维护
X2C的库 可以把xml布局转成Java。
还有Androidx里提供了AsyncLayoutInflater可以异步加载布局
使用AsyncLayoutInflater异步加载布局