Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。
当设计上追求更华丽的视觉效果的时候,我们就容易陷入采用越来越多的层叠组件来实现这种视觉效果的怪圈。这很容易导致大量的性能问题,为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。
幸运的是,我们可以通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况。
蓝色,淡绿,淡红,深红代表了4种不同程度的Overdraw情况,我们的目标就是尽量减少红色Overdraw,看到更多的蓝色区域。
Overdraw有时候是因为你的UI布局存在大量重叠的部分,还有的时候是因为非必须的重叠背景。例如某个Activity有一个背景,然后里面的Layout又有自己的背景,同时子View又分别有自己的背景。仅仅是通过移除非必须的背景图片,这就能够减少大量的红色Overdraw区域,增加蓝色区域的占比。这一措施能够显著提升程序性能。
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的个数和布局的层次。只是图标需要做几套用来做屏幕适
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的个数和布局的层次。只是图标需要做几套用来做屏幕适