优化Android布局——减少过度绘制

TT_123456789 2020-08-14 18:34:40 1559

前言
你有一个好的想法,并且把它用APP实现出来让大家使用。
但是,你却听到很多用户在抱怨你的APP卡顿,用户体验糟糕。

此时,有一个改善你的APP渲染时间的做法:查看调试GPU过度绘制工具

什么是过度绘制?
过度绘制发生在应用程序要求系统在已有的视图上绘制其他视图。
调试GPU过度绘制工具通过在屏幕上覆盖的颜色层数来判断该像素被重绘了几次。

布局文件是一个xml文件,inflate布局文件其实就是解析xml,根据标签信息创建相应的布局对象并做关联。xml中的标签和属性设置越多,节点树的深度越深,在解析时要执行的判断逻辑、函数的嵌套和递归就越多,所以时间消耗越多。
inflate操作只是布局影响的第一个环节,一个界面要显示出来,在requestLayout后还要执行一系列的measure、layout、draw的操作,每一步的执行时间都会受到布局本身的影响。而界面的最终显示是所有这些操作完成后才实现的。所以如果布局质量差,会增加每一步操作的时间成本,最终显示时间就会比较长。
如何打开调试GPU过度绘制工具?
进入系统设置
进入开发者选项
选择调试GPU过度绘制
选择显示过度绘制区域
你会注意到屏幕的颜色改变了,进入你的APP,这时候我们可以开始了解如何改善我们的布局。

不同的颜色代表什么?

原始色(即没有发生改变):代表屏幕上该像素块被绘制了一次。
蓝色(过度绘制1x):代表屏幕上该像素块被绘制了2次。
绿色(过度绘制2x):代表屏幕上该像素块被绘制了3次。
粉色(过度绘制3x):代表屏幕上该像素块被绘制了4次。
红色(过度绘制4x):代表屏幕上该像素块被绘制了5次。

修复过度绘制(一个例子)
在上面的例子中,我移除了RelativeLayout的background颜色并通过theme设置background。

  • 原来的:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
1
2
3
4
修改后:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
1
2
3
修改Layout之后的结果:

如你所见,过度绘制的程度减轻了,红色的区域变少了。
这个应用程序还可以进一步改善,达到以原始色和少量的蓝色为目标。
有些地方的过度绘制是不可避免的。

并不是所有的过度绘制都是设置background color导致的,其他的情况也可能导致过度绘制。例如:复杂的布局层次结构(Layout),复杂的视图叠加(View)。

避免过度绘制的方法
尽量多使用RelativeLayout和LinearLayout,不要使用绝对布局AbsoluteLayout。
在布局层次一样的情况下,建议使用LinearLayout代替RelativeLayout,因为LinearLayout性能要稍高一些。
在完成相对较复杂的布局时,建议使用RelativeLayout,RelativeLayout可以简单实现LinearLayout嵌套才能实现的布局。
将可复用的组件抽取出来并通过include标签使用
使用ViewStub标签来加载一些不常用的布局
动态地inflation view性能要比SetVisiblity性能要好,当然ViewStub是最好的选择。
使用merge标签减少布局的嵌套层次。
去掉多余的背景颜色。
对于有多层背景颜色的Layout来说,留最上面的一层的颜色即可,其他底层的颜色都可以去掉。
对于使用Selector当背景的Layout(比如ListView的Item,会使用Selector来标记点击,选择等不同的状态),可以将normal状态的color设置成"@android:color/transparent",来解决对应的问题。
内嵌使用包含layout_weight属性的LinearLayout会在绘制时花费昂贵的系统资源,因为每一个子组件都需要被测量两次。在使用ListView与GridView的时候,这个问题显得尤为重要,因为子组件会重复被创建,所以要尽量避免使用layout_weight。
使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)。
总结
目标:
控制过度绘制为2x(绿色)
不允许存在4x过度绘制(红色)
不允许存在面积超过屏幕1/4区域的3x过度绘制(粉色)
你也可以使用其他的工具来查看发生过度绘制的原因。
如:Hierarchy Viewer,GL Tracer。
原文链接:点击这里

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
TT_123456789
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区