Android性能调优 - 绘制优化

1.前言

  • 绘制优化 是体现Android性能主要部分之一。
  • 本文主要通过影响、原理、检测、优化四个方向诠释。
  • 文章中实例  linhaojian的Github

2.影响

  • 如果绘制处理不适当,就会导致以下影响:
      * Android 应用界面显示速度。
      * 用户交互时界面发生卡顿现象。

3.绘制原理

  • 简单的理解绘制的过程,可以帮助分析产生上述影响的原因与对应的优化思路。
  • Android应用层视图绘制包含三大流程:测量(measure)、布局(layout)、绘制(draw)
    绘制过程.jpg
      * 测量:确定视图的大小(高、宽);
      * 布局:确定视图的位置(左上角坐标);
      * 绘制:在画布canvas上绘制视图;
  • 在一个Android界面里的视图类似于树结构(父、子View),如下图:
    视图树结构.jpg
  • 由此可知:一个界面就是通过递归的方式,完成所有视图的测量、布局和绘制

4.检测方式

  • 在绘制优化的道路上,我们可以借助工具帮助我们更快、更准确的定位性能问题。

4.1 开发者中的 “过渡绘制” 检测

  • 开启 “过渡绘制” 检测,可以在屏幕上看到不同颜色区域:
    过渡绘制1.png
    过渡绘制.png
  • 根据上图的颜色,判断应用中是否存在过渡绘制的问题,过渡绘制是不可避免的,只可以减少,界面嵌套严重 或者 存在不必要的背景就非常容易导致过渡绘制,所以在布局的当中要减少嵌套与去掉必要的背景。

4.2 开发者中的 "GPU"检测

  • 开启 “GPU检测”,可以在屏幕上看到不同颜色的条形图:
    gpu检测.png
      * 绿色的横线:警戒线,超过这条线则意味着时长超过了16m,尽量要保证垂直的彩色柱状图保持在绿线下面。
    gpu检测1.png
    下面来分别介绍它们的含义:
      * Swap Buffers:表示处理的时间,和上面讲到的橙色一样。
      * Command Issue:表示执行的时间,和上面讲到的红色一样。
      * Sync & Upload:表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减少该段区域的执行时间,我们可以减少屏幕上的图片数量或者是缩小图片的大小。
      * Draw:表示测量和绘制视图列表所需要的时间,和上面讲到的蓝色一样。
      * Measure/Layout:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就需要仔细检查自己的布局是不是存在严重的性能问题。
      * Animation:表示计算执行动画所需要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator,Transition等。一旦这里的执行时间过长,就需要检查是不是使用了非官方的动画工具或者是检查动画执行的过程中是不是触发了读写操作等等。
      * Input Handling:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操作。
      * Misc Time/Vsync Delay:表示在主线程执行了太多的任务,导致UI渲染跟不上vSync的信号而出现掉帧的情况。

5.优化

  • 针对绘制性能问题,把优化分为两个部分:布局、绘制

5.1 布局优化

* 1. 减少界面嵌套,对于负责的View可以使用Constraintlayout;
  * 2. 使用include复用布局;
  * 3. 使用merge去除多余层级;
  * 4. 使用ViewStub提高加载速度(按需才加载 & 显示);
  * 5. 减少不必要的背景(例如:最常见list中item的背景与父控件的背景一样,使得view绘制过渡);

5.2 绘制优化

* 1. 减少onDraw中耗时操作(如:for);
  * 2. 避免onDraw中创建对象,因为onDraw有可能会被频繁调用,如果在此做创建对象操作,内存占有就越来越大,
就有可能会多此触发系统GC ,导致降低了程序的执行效率;
  * 3. 针对有层叠的自定义View,可以多使用clipRect() 、 quickReject();
  * 4. 绘制一些bitmap时,应该只保持一次初始化,并且使用RGB565格式渲染。


6.总结

  • 到此,绘制优化 介绍完毕。
  • 如果喜欢我的分享,可以点击  关注  或者  ,你们支持是我分享的最大动力 。
    linhaojian的Github

欢迎关注linhaojian_CSDN博客或者linhaojian_简书

不定期分享关于安卓开发的干货。


写技术文章初心

  • 技术知识积累
  • 技术知识巩固
  • 技术知识分享
  • 技术知识交流