Android布局优化之过度绘制

如果一个布局十分复杂,那么就需要来排查是否出现了过度绘制,如果出现了,那么很可能会造成刷新率下降,造成卡顿的现象。那么什么是过度绘制呢?过
度绘制就是在同一个区域中叠加了多个控件。这就像小时候我们画画,白纸就是没有绘制的画板,如果我们画了一个房子,涂上了红色,又在上面画了窗户,图上了
棕色,窗户上又画了蓝色的玻璃,这重重复的叠加就是过度绘制,在白纸上的结果是,过度绘制的区域纸会被水笔浸的比较湿,在手机上就会出现显示较慢。如果说
这是感性的认识,那么我就引用下面一段话来理性的解释一下:

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

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

现在,我们就来说说如何查看是否有过度绘制,和如何避免它吧。

 

一、查看是否存在过度绘制

1. GPU过渡绘制:对于过度绘制的测试主要通过人工进行测试,也是发现应用过渡绘制的首选途径 .通过打开开发者选项中的
显示GPU过度绘制(魅族手机:设置—辅助功能–开发人员工具–硬件加速渲染—调试GPU过渡绘制—
显示过渡绘制区域.)来进行测试(PS:只有android4.2及以上的版本才具备此功能)

1. 颜色标识: 从好到差:蓝-绿-淡红-红

1. 蓝色1x过度绘制
2. 绿色2x过度绘制
3. 淡红色3x过度绘制
4. 红色超过4x过度绘制

2. 验收标准:

1. 控制过度绘制为2x
2. 不允许存在4x过度绘制
3. 不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)

从图中我们就可以看到,文字部分出现了绿色(因为和底部的蓝色叠加了,所以变成了黄绿色),在顶部开关部分出现了红色,也就是四层的过度绘制,这是需要避免的。但由于在屏幕上占的位置很小,所以可以酌情考虑。

 

上面面是小米商店的截屏,可以看见其中有大量的过度绘制区域,总结下来过度绘制较常见于文字区域。

 

二、避免过度绘制的方法

下面这段文字来自他人博客:

作者:Gracker
出处:androidperformance.com
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
打赏一下: 微博打赏

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

1. 在布局层次一样的情况下, 建议使用LinearLayout代替RelativeLayout, 因为LinearLayout性能要稍高一点.
2. 在完成相对较复杂的布局时,建议使用RelativeLayout,RelativeLayout可以简单实现LinearLayout嵌套才能实现的布局.

2. 将可复用的组件抽取出来并通过include标签使用;
3. 使用ViewStub标签来加载一些不常用的布局;
4. 动态地inflation view性能要比SetVisiblity性能要好.当然用VIewStub是最好的选择.
5. 使用merge标签减少布局的嵌套层次
6. 去掉多余的背景颜色

7. 对于有多层背景颜色的Layout来说,留最上面一层的颜色即可,其他底层的颜色都可以去掉
8. 对于使用Selector当背景的Layout(比如ListView的Item,会使用Selector来标记点击,选择等不同的状态),可以将normal状态的color设置为”@android:color/transparent”,来解决对应的问题

9. 内嵌使用包含layout_weight属性的LinearLayout会在绘制时花费昂贵的系统资源,因为每一个子组件都需要被测量两次。在使用ListView与GridView的时候,这个问题显的尤其重要,因为子组件会重复被创建.所以要尽量避免使用Layout_weight
10. 使得Layout宽而浅,而不是窄而深(在Hierarchy Viewer的Tree视图里面体现)

 

上面提到的多个工具和技巧我都在之前的文章有所讲解了,在实际开发过程中需要多多思考,根据情况来使用不同的技巧。

时间: 2025-01-19 10:48:38

Android布局优化之过度绘制的相关文章

Android 界面的性能优化 —— 减少过度绘制

本文讲的是Android 界面的性能优化 -- 减少过度绘制, 你有了一个很棒的灵感,并且把它制作成了一个应用程序发布到了网上.但是,现在你听到了来自用户的抱怨,例如这个应用程序运行起来很慢有卡顿的感觉并且太难使用.. 有一个简单的解决方法是,你可以使用 GPU Overdraw 工具来改进应用程序的渲染时间. 什么是过度绘制? 过度绘制发生在每一次应用程序要求系统在某些界面上再绘制一些界面的时候.这个 Debug GPU Overdraw 工具可以在屏幕最上层叠加上一些颜色,它显示出一个像素点

Android布局优化

categories: Android 在Android开发中,我们常用的布局方式主要有LinearLayout.RelativeLayout.FrameLayout等,通过这 些布局我们可以实现各种各样的界面.与此同时,如何正确.高效的使用这些布局方式来组织UI控件,是我们 构建优秀Android App的主要前提之一.本篇内容就主要围绕Android布局优化来讨论在日常开发中我们使用常 用布局需要注意的一些方面,同时介绍一款SDK自带的UI性能检测工具HierarchyViewer. 布局原

【转】Android布局优化之ViewStub

ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法.当ViewStub使用在布局文件中时,当 程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点: 1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他

Android布局优化之ViewStub控件

ViewStub是Android布局优化中一个很不错的标签/控件,直接继承自View.虽然Android开发人员基本上都听说过,但是真正用的可能不多. ViewStub可以理解成一个非常轻量级的View,与其他的控件一样,有着自己的属性及特定的方法.当ViewStub使用在布局文件中时,当程序inflate布局文件时,ViewStub本身也会被解析,且占据内存控件,但是与其他控件相比,主要区别体现在以下几点: 1.当布局文件inflate时,ViewStub控件虽然也占据内存,但是相相比于其他控

Android布局优化之ViewStub、include、merge使用与源码分析

http://blog.csdn.net/bboyfeiyu/article/details/45869393 在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性.复杂度也会随之增长.Android官方给了几个优化的方法,但是网络上的资料基本上都是对官方资料的翻译,这些资料都特别的简单,经常会出现问题而不知其所以然.这篇文章就是对这些问题的更详细的说明,也欢迎大家多留言交流. 一.include 首先用得最多的应该是include,按照官方的意思,include就是为了解决重复

详解Android性能优化之内存泄漏_Android

综述 内存泄漏(memory leak)是指由于疏忽或错误造成程序未能释放已经不再使用的内存.那么在Android中,当一个对象持有Activity的引用,如果该对象不能被系统回收,那么当这个Activity不再使用时,这个Activity也不会被系统回收,那这么以来便出现了内存泄漏的情况.在应用中内出现一次两次的内存泄漏获取不会出现什么影响,但是在应用长时间使用以后,若是存在大量的Activity无法被GC回收的话,最终会导致OOM的出现.那么我们在这就来分析一下导致内存泄漏的常见因素并且如何

Android应用性能优化最佳实践.2.4 避免过度绘制

2.4 避免过度绘制 过度绘制(Overdraw)是指在屏幕上的某个像素在同一帧的时间内被绘制了多次.在多层次重叠的UI结构(如带背景的TextView)中,如果不可见的UI也在做绘制的操作,就会导致某些像素区域被绘制了多次,从而浪费多余的CPU以及GPU资源. 当设计上追求更华丽的视觉效果时,我们很容易陷入采用复杂的多层次重叠视图来实现这种视觉效果的怪圈.这很容易导致大量的性能问题,为了获得最佳性能,必须尽量减少Overdraw情况发生. 我们一般在XML布局和自定义控件中绘制,因此可以看出导

Android应用性能优化最佳实践.2.3 布局优化

2.3 布局优化 布局是否合理主要影响的是页面测量时间的多少,我们知道一个页面的显示测量和绘制过程都是通过递归来完成的,多叉树遍历的时间与树的高度h相关,其时间复杂度为O(h),如果层级太深,每增加一层则会增加更多的页面显示时间. 任何时候View中的绘制内容发生变化时,都需要重新创建DisplayList.渲染DisplayList,更新到屏幕上等一系列操作.这个流程的表现性能取决于View的复杂程度.View的状态变化以及渲染管道的执行性能.例如,假设某个Button的大小需要增大到目前的两

Android应用开发中View绘制的一些优化点解析_Android

 一个通常的错误观念就是使用基本的布局结构(例如:LinearLayout.FrameLayout等)能够在大多数情况下    产生高效率 的布局. 显然,你的应用程序里添加的每一个控件和每一个布局都需要初始化.布局(layout).    绘制 (drawing).举例来说:嵌入一个LinearLayout会产生一个太深的布局层次.更严重的是,嵌入几个使    用 layout_weight属性的LinearLayout 将会导致大量的开销,因为每个子视图都需要被测量两次.这是反复解析