优化前:
如何发现和监控XML的过度渲染和绘制?
设置—>开发人员选项—>硬件—>调试GPU过度绘制,然后选择 显示过度绘制区域 即可以看到一个不同颜色块的手机界面,各个颜色代表着不同的绘制情况:
本着最简洁的优化目标,理想化都应该是白色的,有些过度绘制我们无法避免,
白色:无过度绘制
蓝色:1次过度绘制
绿色:2次过度绘制
粉色和红色:你们懂的,去优化XML吧
如何避免过度绘制?
1、去除style.xml中的<item name="android:windowBackground">@color/*****</item>
解决方法:
<item name="android:windowBackground">@null</item>
或getWindow().setBackgroundDrawable(null);
2、去除控件中不必要的背景填充,背景色填充是非常耗资源
- 列表中的子项,可以移除子项的背景色填充
- 一个xml尽可能少的做背景色填充
3、减少透明度的使用,每个透明度都会进行两次以上的渲染
4、使用ConstraintLayout减少布局层级,ConstraintLayout比RelativeLayout性能更好,更简单
5、使用merge标签减少布局层级,
6、使用AsyncLayoutInflater异步加载,把耗时的布局渲染操作放在子线程中,等inflate操作完成后再回调到主线程(此方法只解决卡顿,而没有从根源的优化过度绘制)
new AsyncLayoutInflater(this).inflate(R.layout.activity_main, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
public void onInflateFinished(@NonNull View view, int resid, @Nullable ViewGroup parent) {
//view:加载得到 view
setContentView(R.layout.activity_main);
//一系列的 findViewById(...),adapter...
}
});
7、使用ViewStub标签延迟加载,个人感觉非必要
经过自己的项目实践,窄而深的嵌套布局,在项目中很少有,但是控件背景色确实是影响过度绘制的主要原因,筛查一下页面中的背景色,会有很好的效果!重复使用背景色填充的主要原因是我们所习惯的“复制粘贴”,因为项目中有很多相同的布局,从而忽略了其独有的背景色填充
网友评论