根据其中的思路,尝试优化自己的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的个数和布局的层次。只是图标需要做几套用来做屏幕适