过度绘制优化(主要减少GPU工作量)
(1)什么是过度绘制
GPU的绘制过程,就跟刷墙一样一层层的进行,16ms刷一次。这样就会造成图层覆盖的现象,即无用的图层还被绘制在底层,造成不必要的浪费。
(2)GPU过度绘制的几种情况
a、自定义控件中,ondraw做了过多重复绘制。
b、布局层次太深,重叠性太强。用户看不到的区域,GPU也会渲染,导致耗时增加。
(3)过度绘制查看工具
查看方法:开发者选项-》Profile GPU rendering/调试GPU过度绘制
GPU过度绘制查看工具
其中颜色代表渲染的图层情况,分别代表1层、2层、3层、4层。
蓝色:过度绘制一次,无过度绘制
淡绿:过度绘制两次
淡红:过度绘制三次
深红:过度绘制四次
以上代表了4种不同程度overdraw情况,我们的目标就是尽量减少红色overdraw,看到更多的蓝色区域。
(4)处理方案
1、减少背景重复
注意主题中的设置:
a、去掉单个activity的主题设置的属性:
可以在setContentView之前
getWindow().setBackgroundDrawable(null);
b、去掉所有activity主题设置中的属性:
直接在styles.xml中设置
@null
非业务需要,不要去设置背景。
2、绘图时使用裁减减少控件之间的重合部分
3、Android7.0之后系统做出的优化:invalidate()不再执行测量和布局动作
布局的优化(主要减少CPU工作量)
(1)常用工具
1、Android/sdk/tools/bin/uiautomatorviewer.bat
2、Androidsdkoolsmonitor.bat
3、Device Monitor窗口中Hierarchy view
三个点也是代表着View的Measure, Layout和Draw。
绿: 表示该View的此项性能比该View Tree中超过50%的View都要快;例如,代表Measure的是绿点,意味着这个视图的测量时间快于树中的视图对象的50%。
黄: 表示该View的此项性能比该View Tree中超过50%的View都要慢;
红: 表示该View的此项性能是View Tree中最慢的;。
(2)注意点
1.能在一个平面显示的内容,尽量只用一个容器,避免嵌套
2.尽可能把相同的容器合并merge
3.能复用的代码,用include处理,可以减少GPU重复工作