Android性能优化(三)绘制优化

         前面两篇博客我总结了启动优化和内存优化的相关技术和工具。这篇博客,我总结一下绘制优化,也可以叫布局优化,我更倾向于称之为绘制优化。因为,我会从Android屏幕绘制的基本原理开始说起,进而到布局的加载。而且,Android的布局就是Android系统通过某些方法“绘制”到屏幕上去的。

一、前言

        在正式的说绘制优化之前,我依旧说一下自己以前的经历,这事得回到三年前。某个上午,我依旧很早就去上班了。因为昨天晚上,我的版本提测通过了,接下来需要提交到性能组。而在我当时,自以为对性能优化已经有了充分的认识和实践,在提测前已经测试了N次,并且把可能导致内存泄漏的代码全部检查了一编。启动速度,在经过异步加载后,也可以,达到了XXms的要求。然而,打开电脑,打开outlook,看到了一个严重bug。打开链接过去查看,大体是这样的:【XXX性能测试】XXX页面存在5X过度绘制,请优化到3X。然后下面附加了一张图。我一看,懵逼了,5X过度绘制是个什么鬼?依旧百度一下,哦,原来布局层级太深了。然后我看了一下xml文件,确实布局层级挺多的。但是,由于这个界面功能繁多,我感觉没法再减少布局了。当然,那只是我那时候的认知,因为三年前,我还停留在“一切界面都可以使用LinearLayout实现,LinearLayout无所不能”。

二、绘制机制

        在这里,简单的介绍一下Android屏幕绘制的机制。先大体说一下,Android的绘制需要CPU和GPU的共同参与。CPU负责将要展示的空间计算为纹理,而GPU负责将这些纹理进行栅格化渲染。下面,说一下跟绘制相关的几个关键知识点:

1、Vsync信号

        Android系统每隔16ms会发出一个叫做Vsync的信号,Vsync信号会触发View的刷新,如果每次都16ms内完成刷新,那么我们的app就能达到60fps的流畅度。在这里引用网上的一张图片:

2、16ms

        可能有些朋友会有疑问,为什么是16ms?因为人眼能感知到的最完美的帧率就是60fps。在这里,我不去纠结人眼能不能感知超过60fps的帧率。据一些资料显示,是可以超过60fps的。60fps的意思就是1秒时间展示60帧。那一帧的时间就是:

        1/60 = 0.1667(秒) ≈16(毫秒)

3、丢帧

        那假如我们的View没有在16ms内完成渲染,比如某个耗时操作(例如复杂计算、I/O操作、GC等)超过了16ms,那么,用户在32ms内看到的就是同一帧画面。这种用户在多个渲染周期内看到同一帧画面的现象,就叫做丢帧。很好理解,我第二个16ms应该看到第二帧的,但是你没给我显示第二帧,那么是不是可以理解为第二帧丢失了。

4、过度绘制

        说完丢帧,那就不得不提一下过度绘制。一个渲染周期内对同一块像素区域绘制多次也是不合理的,因为绘制就需要消耗CPU和GPU资源。这个呢,也很好理解。例如,我写了一个xml布局,这个布局root布局是一个LinearLayout,里面放了一个Button。那么,没有Button的区域,就是只有一层布局,这个区域内的像素我只需要绘制一次。而对于Button和父布局重叠的部分,我既要绘制底下的父布局,又要绘制Button,因此绘制了两层。

        我们可以在开发者选项中打开过度绘制的功能,查看当前布局的过度绘制情况。例如,下图是我demo的过度绘制情况:

        对布局中的颜色进行一下说明: 

        (1)一层:白色。

        (2)两层:蓝色。

        (3)三层:绿色。

        (4)四层:橙色。 

        (5)五层:红色。

        而我们对过度绘制进行优化的目标就是:减少四层五层,控制在三层以内。当然,最好就是一层。显然,大多数情况下,这是不合理的。

三、绘制优化工具

        “工欲善其事,必先利其器”。在这个章节,我介绍几种跟绘制优化相关的工具和技巧。

1、Systrace

        相信大家都听说过Systrace,这是Google在2017年开发者大会上大力推荐的性能优化工具。我们在前面介绍过TraceView,TraceView使用上非常方便,可以任意指定开始和结束的位置,但是,TraceView本身的性能消耗就是非常严重的。因此,Google推出了Systrace。这个工具不像TraceView那么有侵入性,不会对性能造成太大的影响。但是,他不能任意的指定开始和结束位置。那么,如何使用Systrace呢?

(1)首先,Systrace是一个python脚本。因此,运行这个脚本需要python开发环境。对于Systrace需要的python开发环境,大家一定要注意如下几个问题:

  • 一定要在Python2.7.x使用。因为Systrace不支持高版本的Python。
  • 除了Python环境外,Systrace脚本还依赖于两个其他的py库:pywin32和six。具体如何安装这两个库,可以自行百度。

(2)在完全准备好python开发环境后,在cmd窗口输入如下命令:python [Systrace路径] -b [内存上限] -t [抓取时间] -a [包名] -xxx.html [后缀]。这个命令很长,而且需要结合自己的Systrace所在的位置以及自己的app包名来写这个命令,例如我的:python /Users/lenovo/AppData/Local/Android/Sdk/platform-tools/systrace/systrace.py -b 32768 -t 5 -a com.example.tuduoptimize -o optimize.html gfx

(3)在这个命令正确执行后,会输出:“Starting tracing(5 seconds)”。意思就会已经开始抓取trace,5秒钟时间。这时候,我们需要对我们的app做相应的操作。例如,我抓取的就是app启动时的trace,那么我看到这个提示后,我就启动我的app。抓取成功后,会告诉我们trace文件存放在哪里。

2、Layout Inspacter

3、ChoreoGrapher

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个玩游戏的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值