安卓性能优化—绘制优化

1,654 阅读3分钟
原文链接: blog.csdn.net

绘制优化指view的onDraw方法要避免执行大量的操作,这主要体现在以下几个方面:

1.减少对象创建

onDraw中要尽量减少局部对象的创建,因为onDraw方法可能会被频繁的调用,这样就会在一瞬间产生大量的临时对象,这不仅占用过多内存而且会导致频繁的gc,降低了程序的执行效率;

2.杜绝耗时操作

在onDraw中不要执行耗时操作,也不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环也是十分抢占CPU的时间片。就会造成绘制过程不流畅。Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染,按照谷歌的性能标准,view的绘制帧率保证60fps是最佳的,这就要求每帧的绘制时间在16ms以内。

3.减少Overdraw

Overdraw(过度绘制)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的UI结构里面,如果不可见的UI也在做绘制的操作,这就会导致某些像素区域被绘制了多次。这就浪费大量的CPU以及GPU资源。
为了获得最佳的性能,我们必须尽量减少Overdraw的情况发生。我们可以通过手机设置里面的开发者选项:设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制,就可以观察UI上的Overdraw情况。
这里写图片描述

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

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

2.使用clipRect

Nav Drawer从前置可见的Activity滑出之后,如果还继续绘制那些在Nav Drawer里面不可见的UI组件,这就导致了Overdraw。为了解决这个问题,Android系统会通过避免绘制那些完全不可见的组件来尽量减少Overdraw。那些Nav Drawer里面不可见的View就不会被执行浪费资源。对于那些过于复杂的自定义的View(重写了onDraw方法),Android系统无法检测具体在onDraw里面会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。

  if (i < mCards.length - 1)
            {
                canvas.clipRect(0, 0, 120, mCards[i].getHeight());
            }

没有显示在最顶层的view,就设置clipRect,避免绘制。
除了clipRect方法之外,我们还可以使用canvas.quickreject()来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的绘制操作。

3.减少层级

这个在之前那篇布局优化已经提到过了;