布局渲染流程原理及优化

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值