更多关于Android渲染性能请点击这里
系统UI组件的优化
对不可见的UI组件进行绘制更新会导致Overdraw。例如Nav Drawer从前置可见的Activity滑出之后,如果还继续绘制那些在Nav Drawer里面不可见的UI组件,这就导致了Overdraw。为了解决这个问题,Android系统会通过避免绘制那些完全不可见的组件来尽量减少Overdraw。那些Nav Drawer里面不可见的View就不会被执行浪费资源。
![](https://i-blog.csdnimg.cn/blog_migrate/bc6aac1c69140aaa4ec1a63d18fd8043.png)
自定义UI组件clipRect
对于那些过于复杂的自定义的View(通常重写了onDraw方法),Android系统无法检测在onDraw里面具体会执行什么操作,系统无法监控并自动优化,也就无法避免Overdraw了。但是我们可以通过canvas.clipRect()来帮助系统识别那些可见的区域。这个方法可以指定一块矩形区域,只有在这个区域内才会被绘制,其他的区域会被忽视。这个API可以很好的帮助那些有多组重叠组件的自定义View来控制显示的区域。同时clipRect方法还可以帮助节约CPU与GPU资源,在clipRect区域之外的绘制指令都不会提交至硬件,那些部分内容在矩形区域内的组件,仍然会得到绘制。
![](https://i-blog.csdnimg.cn/blog_migrate/98fbc04a0a6a4cf72aec0903afbee5db.png)
现在,任何与clipRect有部分交叉的内容还是会被绘制,这也是clipRect在CPU方面帮助定义排除矩形,从而从像素层面上让GPU避免为剪裁部分上色的原因
![](https://i-blog.csdnimg.cn/blog_migrate/a1dff8e3a0cf0ee393edccb357afbccc.png)
自定义UI组件quickreject()
我们还可以使用canvas.quickreject() 在onDraw中来判断是否没和某个矩形相交,从而跳过那些非矩形区域内的全部处理过程。
![](https://i-blog.csdnimg.cn/blog_migrate/81c4f3dfe7cb80c5493913b04f7633c2.png)