布局渲染流程原理及优化

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异步加载布局

猜你喜欢

转载自blog.csdn.net/yanwenyuan0304/article/details/106299301