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_简书

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


写技术文章初心

  • 技术知识积累
  • 技术知识巩固
  • 技术知识分享
  • 技术知识交流
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 昨天是小宝出生后,妈妈离开的第一天,也是我和妞妞独自照顾他的第一天,感觉还不错。就是有些太忙碌了,做饭都要亲自做了...
    秋子的追寻阅读 146评论 0 1
  • 《相思》是由彭擎政指导的一部动画短片。讲述了嘉定名士王初桐和发小六娘青梅竹马、红豆定情却无缘厮守的爱情故事。 ...
    莫莹2018阅读 485评论 0 2
  • 43.ajax 的过程是怎样的 创建XMLHttpRequest对象,也就是创建一个异步调用对象 创建一个新的HT...
    开心糖果的夏天阅读 286评论 0 3