性能优化—过渡绘制

过渡绘制

概念

   GPU过度绘制指的是在屏幕一个像素上绘制多次(超过一次),比如一个TextView后有背景,那么显示文本的像素至少绘了两次,一次是背景,一次是文本。GPU过度绘制或多或少对性能有些影响,设备的内存带宽是有限的,当过度绘制导致应用需要更多的带宽(超过了可用带宽)的时候性能就会降低。

过渡绘制的原因:

  • 太多的View叠加
  • 复杂的层级叠加
  • 更长的inflation时间

过渡绘制的影响

   布局文件是一个xml文件,inflate布局文件其实就是解析xml,根据标签信息创建相应的布局对象并做关联。xml中的标签和属性设置越多,节点树的深度越深,在解析时要执行的判断逻辑、函数的嵌套和递归就越多,所以时间消耗越多;

   inflate操作只是布局影响的第一个环节,一个界面要显示出来,在requestLayout后还要执行一系列的measure、layout、draw的操作,每一步的执行时间都会受到布局本身的影响。而界面的最终显示是所有这些操作完成后才实现的,所以如果布局质量差,会增加每一步操作的时间成本,最终显示时间就会比较长,就会在视觉上让人觉得卡顿。

优化工具介绍与使用

   Android提供了三个工具来帮助辨别和解决重绘问题:Hierachy Viewer,Tracer for OpenGL、Show GPU Overdraw和Layout Inspector。前两个可以在ADT工具或者独立的monitor工具中找到,Show GPU Overdraw是在开发者选项的一部分,Layout Inspector是Android Studio提供的分析工具。

GPU过渡绘制:

   对于过度绘制的测试主要通过人工进行测试,也是发现应用过渡绘制的首选途径 ,通过打开开发者选项中的显示GPU过度绘制。

小米手机:设置—更多设置—开发者选项—硬件加速渲染—调试GPU过渡绘制—显示过渡绘制区域

颜色标识: 从好到差:蓝-绿-淡红-红
	1. 蓝色1x过度绘制
	2. 绿色2x过度绘制
	3. 淡红色3x过度绘制
	4. 红色超过4x过度绘制
验收标准:
	1. 控制过度绘制为2x
	2. 不允许存在4x过度绘制
	3. 不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)

Lint工具:

   Android Studio自带Lint工具,不合理或者需要优化和注意的地方,会用黄色标记出来,开发者可以跟进提示对提示进行优化。

   其作用如下:

1. Lint工具不仅对布局有很好的优化建议,对代码中不合理的活着存在潜在风险的模块也会提出优化建议,所以一个好的建议是:多使用Lint工具检查自己的应用,尽量消除所有的建议。
2. Lint工具可以用命令行来运行,具体使用可以参考:tools.android.com
3. Lint工具的提升例子(摘自官方文档):
	1. Use compound drawables(使用compound drawables) - A LinearLayout which contains an ImageView and a TextView can be more efficiently handled as a compound drawable.
	2. Merge root frame(使用Merge根框架)- If a FrameLayout is the root of a layout and does not provide background or padding etc, it can be replaced with a merge tag which is slightly more efficient.
	3. Useless leaf(去除无用的分支) - A layout that has no children or no background can often be removed (since it is invisible) for a flatter and more efficient layout hierarchy.
	4. Useless parent (去除无用的父控件)- A layout with children that has no siblings, is not a ScrollView or a root layout, and does not have a background, can be removed and have its children moved directly into the parent for a flatter and more efficient layout hierarchy.
	5. Deep layouts (注意Layout的深度) - Layouts with too much nesting are bad for performance. Consider using flatter layouts such as RelativeLayout or GridLayout to improve performance. The default maximum depth is 10.  

Hierarchy Viewer:

   此工具是一个ADT工具(或者monitor,最新版本的SDK建议不使用独立的HV工具,而是直接在monitor中进行操作。)的一部分,可以被用作对视图层级进行快速解读。在处理布局问题时特别有用,对于性能问题也很适用。Hierarchy Viewer默认只能在非加密设备使用,例如工程机,工程平板或者模拟器。为了能够在任何手机上使用Hierarchy Viewer,你得在你的应用中添加ViewServer,这是一个开源库,使用方法可以参考这里。连接上设备,打开Hierarchy Viewer(定位到tools/目录下,直接执行hierarchyviewer的命令,选定需要查看的Process,再点击Load View Hierarchy会显示出当前界面的布局Tree。在每个模块的Traffic light上有三个灯,分别代表了Measure,Layout and Draw三个步骤的性能。

布局优化建议:

   布局原则:在Android UI布局过程中,通过遵守一些惯用、有效的布局原则,我们可以制作出高效且复用性高的UI,概括来说包括如下几点:

  1. 尽量多使用RelativeLayout和LinearLayout,不要使用绝对布局AbsoluteLayout;

    • 在布局层次一样的情况下, 建议使用LinearLayout代替RelativeLayout, 因为LinearLayout性能要稍高一点。
    • 在完成相对较复杂的布局时,建议使用RelativeLayout,RelativeLayout可以简单实现LinearLayout嵌套才能实现的布局。
  2. 将可复用的组件抽取出来并通过include标签使用;

  3. 使用ViewStub标签来加载一些不常用的布局;

  4. 动态地inflation view性能要比SetVisiblity性能要好,当然用VIewStub是最好的选择;

  5. 使用merge标签减少布局的嵌套层次;

  6. 去掉多余的背景颜色(查看背景颜色是否多余,可以将HierarchyView中的图导出为psd文件,然后用Photoshop查看,具体可以参考这个视频

    1. 对于有多层背景颜色的Layout来说,留最上面一层的颜色即可,其他底层的颜色都可以去掉。
    2. 对于使用Selector当背景的Layout(比如ListView的Item,会使用Selector来标记点击,选择等不同的状态) ,可以将normal状态的color设置为"@android:color/transparent",来解决对应的问题。
  7. 内嵌使用包含layout_weight属性的LinearLayout会在绘制时花费昂贵的系统资源,因为每一个子组件都需要被测量两次。在使用ListView与GridView的时候,这个问题显的尤其重要,因为子组件会重复被创建,所以要尽量避免使用Layout_weight;

  8. 使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值