过度绘制
过度绘制就是在绘制界面时,对同一个像素重复绘制了多次,但是用户能够看到的也只有最顶层绘制的内容,GPU过度绘制或多或少对性能有些影响。
检测过度绘制
如何查看是否过度绘制:
设置-开发者选项-调试GPU过度绘制-显示过度绘制区域(过度渲染等,不同机器可能不同)
然后就可以看看你的应用是否存在过度绘制的情况了。
那么如何判断界面是否存在过度绘制呢?
开启后,点击我们的应用,可以看到各种颜色的区域,其中:
最理想的是蓝色,一个像素只绘制一次,合格的页面绘制是白色、蓝色为主,绿色以上区域不能超过整个的三分之一,颜色越浅越好。
项目实践
用工具对我项目测试了下,大部分页面都存在过渡绘制的情况;列举两个
UI界面粉红色居多,大部分都是绿色,我希望达到的目标去除粉红色,可以有绿色,大部分是蓝色。最后是这样
优化原则
一些过度绘制是无法避免的,比如之前说的文字和背景导致的过度绘制,这种是无法避免的。
应用界面中,应该尽可能地将过度绘制控制为 2 次(绿色)及其以下,原色和蓝色是最理想的。
粉色和红色应该尽可能避免,在实际项目中避免不了时,应该尽可能减少粉色和红色区域。
不允许存在面积超过屏幕 1/4 区域的 3 次(淡红色区域)及其以上过度绘制。
优化方法
1.移除默认的 Window 背景
一般应用默认继承的主题都会有一个默认的 windowBackground ,比如默认的 Light 主题
或者在代码中设置 getWidow.setBackgroundDrawable(null);
2.移除不必要的背景
移除XML布局文件中非必需的Background
3.减少布局嵌套的层级
尽量减少视图的深度,来减少视图树的遍历过程
使用ConstraintLayout代替LinearLayout
4.ViewStub(延迟化加载)
主要的应用场景就比如说新闻App,打开某个界面,如果有网络就展示内容,没有网络就会提示出网络连接出错,这个出错提示就是ViewStub,在正确的条件下才会显示出内容。
5.include(引入布局)
当不同的界面有相同的UI元素的时候我们可以使用include标签,不过引入的布局还可能会被嵌套在LinearLayout,RelativeLayout里面。所以引入merge标签。
6.merge
在引入布局文件里面,最外层可以用merge替代LinearLayout,RelativeLayout,这样把子UI元素直接衔接在include位置。