热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

安卓性能优化1--过度绘制

2015新年伊始,Google发布了关于Android性能优化典范的专题。视频连接https:www.youtube.complaylist?listPLWz5rJ2EKKc9CBxr3B


2015新年伊始,Google发布了关于Android性能优化典范的专题
视频连接  https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE  文章连接 http://hukai.me/android-performance-patterns/  根据其中的思路,尝试优化自己的app。 本文主要讲过度绘制问题

 

一、谷歌文章中对过度绘制的描述和解决方案

Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。

当设计上追求更华丽的视觉效果的时候,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。这很容易导致大量的性能问题,为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。

幸运的是,我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况。

蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。

Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加蓝色区域的占比。这一措施能够显著提升程序性能。


二、我的实际操作过程

   1、开启手机设置中开启“调试GPU过度绘制”

在设置 -->开发者选择项 -->调试GPU过度绘制 中选择“显示过度绘制区域”,这样就可以看到上文中提到的四种颜色。这里需要注意的是,我设置了这个之后,我的app并没有出现上述四种颜色。什么都没有。花了大量时间测试查找,才发现是因为我在配置文件AndroidManifest.xml 的  application中设置了  android:hardwareAccelerated="false" (禁止使用硬件加速)。把它改为true或者直接删掉就可以了AndroidManifest.xml中的属性真的不能随便写的,可以查看这篇文章去了解每个属性的意义http://blog.csdn.net/bihansheng2010/article/details/50236671 

2、开始优化

过度绘制非常普遍的存在,有的是因为疏忽(这个直接去掉就好了),有的是因为布局设计不合理(这个就得优化布局了)。通过颜色的不同我们很容易找到那些需要优化
这一块的实际操作很细,主要就是找到颜色很深的那一块的布局文件,查看他的层次,确认无用的背景设置,尝试优化,返回再查看,如果可以就执行,不行就回退。关键是反复尝试。

1)大背景色

我们在最上层View中设置了通用的灰色背景,然后在某些子控件中也设置了,尤其是include引入的控件,listView的item控件布局中很常见。
这样有个小技巧,如果item有点击效果,item的选着器selector中设置item的默认颜色为null,这样ilistView中可以减少一层背景。

2 )主题色

我们的app因为跳转支付宝的问题,设置了主题色是透明色。这个造成了我如果不设置最顶层控件的背景色,就会出现黑色的现象,这个在使用png透明图片的时候很明显,造成了很多不必要背景层
在测试demo中,我爸主题设设置为常用背景色,可以减少背景色的设置次数,减少过度绘制问题
其次,
背景色的使用时有兼容性问题的,最红同时开几个虚拟机去查看优化效果

3)RelativeLayout  和LinearLayout 的选择

很多时候用RelativeLayout 代替LinearLayout 可以减少布局文件的层次,减少背景绘制的次数,或者减少背景绘制的区域,这个还是比较有用的,尤其是在用深灰色的区域来分类模块时,
但是这个还是要看具体的设计。我的app中就发现几个可以用这个方法来优化的地方。

4 ) textView的drawable 的使用

textView可以设置图标的,这个在很多时候很好用,可以有效的减少view的个数和布局的层次。只是图标需要做几套用来做屏幕适


推荐阅读
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
author-avatar
MiSsGrAce低调人生称_854
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有