Android绘制优化(一)绘制性能分析

本文详细介绍了Android应用的绘制原理,包括measure、layout和draw步骤,以及绘制过程中的性能关键点。通过分析Profile GPU Rendering,理解了不同颜色柱状图的含义,帮助找出性能瓶颈。Systrace工具的使用方法和分析技巧也被详述,包括在DDMS、命令行和代码中如何运用。最后,文章提到了Traceview作为深入分析CPU方法调用耗时的工具。通过对实际代码的监控,展示了如何发现和解决性能问题。
摘要由CSDN通过智能技术生成

前言

一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求。运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CPU,因此在开发Android应用程序时也不可能无限制的使用CPU和内存,如果对CPU和内存使用不当也会造成应用的卡顿和内存溢出等问题。因此,应用的性能优化对于开发人员有着更高的要求。Android性能优化分为很多种,比较常用的有绘制优化、内存优化、耗电优化和稳定性优化等,这个系列我们就来学习性能优化中的绘制优化。

1.绘制原理

Android绘制View有三个主要的步骤,分别是measure、layout和draw。关于它们的原理请查看我的文章Android View体系(七)从源码解析View的measure流程Android View体系(八)从源码解析View的layout和draw流程,这里就不在赘述。measure、layout和draw方法主要是运行在系统的应用框架层,而真正将数据渲染到屏幕上的则是系统Nativie层的SurfaceFlinger服务来完成的。

绘制过程主要是由CPU 来进行Measure、Layout、Record、Execute的数据计算工作,GPU负责栅格化、渲染。CPU和GPU是通过图形驱动层来进行连接的。图形驱动层维护了一个队列,CPU将display list添加到该队列中,这样GPU就可以从这个队列中取出数据进行绘制。

渲染时间线

FPS(Frames Per Second)这个名词我想很多同学都知道,它是指画面每秒传输帧数,通俗来讲就是指动画或视频的画面数,最简单的举例就是我们玩游戏时,如果画面在60fps则不会感觉到卡顿,如果低于60fps,比如50fps则会感觉到卡顿,你就可以考虑要换显卡或者采取其他一些措施了。
要想画面保持在60fps,则需要每个绘制时长在16ms以内,如下图所示。

04080416_dgEb.png

Android系统每隔16ms发出VSYNC信号,触发对UI进行渲染, 如果每次渲染都成功,这样就能够达到流畅的画面所需要的60fps,那什么是VSYNC呢?VSYNC是Vertical Synchronization(垂直同步)的缩写,是一种定时中断,一旦收到VSYNC信号,CPU就开始处理各帧数据。
如果某个操作要花费24ms,这样系统在得到VSYNC信号时无法进行正常的渲染,会发生丢帧。用户会在32ms中看到同一帧的画面,如下图所示。

04080416_cWwX.png

产生卡顿原因有很多,主要有以下几点:
- 布局Layout过于复杂,无法在16ms内完成渲染。
- 同一时间动画执行的次数过多,导致CPU或GPU负载过重。
- View过度绘制,导致某些像素在同一帧时间内被绘制多次。
- UI线程中做了稍微耗时的操作。

为了解决上述的问题,除了我们要在写代码时要注意外,也可以借助一些工具来分析和解决卡顿问题。

2.Profile GPU Rendering

Profile GPU Rendering是Android 4.1系统提供的开发辅助功能,我们可以在开发者选项中打开这一功能,如下图所示。

打开Profile GPU Rendering_副本_副本.png
我们点击Profile GPU Rendering选项并选择On screen as bars即开启Profile GPU Rendering功能。接着屏幕会显示出彩色的柱状图,如下所示。

Screenshot_20170308-152841_副本.png
上面的彩色的图的横轴代表时间,纵轴表示某一帧的耗时。绿色的横线为警戒线,超过这条线则意味着时长超过了16m,尽量要保证垂直的彩色柱状图保持在绿线下面。这些垂直的彩色柱状图代表着一帧,不同颜色的彩色柱状图代表不同的含义:

  • 橙色代表处理的时间,是CPU告诉GPU渲染一帧的地方,这是一个阻塞调用,因为CPU会一直等待GPU发出接到命令的回复,如果橙色柱状图很高,则表明GPU很繁忙。
  • 红色代表执行的时间,这部分是Android进行2D渲染 Display List的时间。如果红色柱状图很高,可能是由重新提交了视图而导致的。还有复杂的自定义View也会导致红的柱状图变高。
  • 蓝色代表测量绘制的时间,也就是需要多长时间去创建和更新DisplayList。如果蓝色柱状图很高,可能是需要重新绘制,或者View的onDraw方法处理事情太多。

在Android 6.0中,有更多的颜色被加了进来,如下图所示:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值