Android性能测试之流畅度测试

流畅度测试简单的来讲就是Android页面绘制。Android系统每秒60hz,也就是大约每16ms刷新一次界面。可是在咱们使用APP过程当中,常常会看到页面有卡顿,或者说丢帧的现象。也就是说可能此刻两个页面绘制的时间差超过0.1S(人眼视觉残留0.1S)。总的来讲,就是页面oop

原理分析测试

在肯定衡量指标以前,先来讲Android的UI更新机制。动画

在Android版本更新过程当中,发如今Jelly Bean中Google加入了一个Project Butter,用来解决严重影响Android口碑的问题之一“UI流畅性差”的问题。而Project Butter中主要引入了三个核心元素:VSYNC(垂直同步)、Triple Buffer和Choreographer。对象

VSync是Vertical Synchronization(垂直同步)的缩写,是一种在PC上很早就普遍使用的技术,能够简单的把它认为是一种定时中断。而在Android 4.1(JB)中已经开始引入VSync机制。CPU和GPU的处理时间都少于一个VSync的间隔,即16.6ms。若是每一个间隔都有绘制的状况下,当前的FPS即为60帧。事件

VSync机制就像是播放动画片(60帧/s)。每次都会播放画面,有的时候有人偷懒了,机器坏了,就会出现播放速度下降的情况。咱们把这个播放速度叫作流畅度。ip

从FPS&丢帧到流畅度文档

实际上在不少Android的App中,不多有须要不断地去绘制的场景,不少时候页面都是静态的。也就是会出现这样的情况,虽然1s中VSync的60个Loop不是每一个都在作绘制的工做,FPS会比较低,但并不表明这个时候程序不流畅(如我将App放着不动,实测FPS为1)。因此FPS较低并不能表明当前App在UI上界面不流畅,而1s内VSync这个Loop运行了多少次更加能说明当前App的流畅程度。因此,下面这2个指标比FPS更能表明当前的App是否处于流畅的状态。一样这2个指标更加可以量化App卡顿的程度:get

1)丢帧(SF: Skipped Frame):如上图2所示状况应该在16.6ms完成工做却因各类缘由没作完,占了后n个16.6ms的时间,至关于丢了n帧。input

2)流畅度(SM: SMoothness):和丢帧相对,在VSync机制中1s内Loop运行的次数。animation

和丢帧相对1s内有60个Loop由于某几回工做时间超过了16.6ms(丢帧),这样Loop就没法运行60次(理论最大值)。

当流畅度越小的时候说明当前程序越卡顿。

如何获得流畅度(SM: SMoothness)

接着上面的结论,若是在这样的机制下每次Loop运行以前进行通知,记个数就行了。

很幸运咱们在新的Android的那一套机制中找到了一个画图的打杂工Choreographer这个对象。根据Google的官方API文档描述中,它是用来协调animations、input以及drawing时序的,而且每一个Loop共用一个Choreographer对象。

结论

经过如上原理分析能够得出结论:

1) Android 4.1引入了VSync机制后,能够经过其Loop来了解当前App最高绘制能力。

固定每隔16.6ms执行一次(这个值是一个静态变量,会根据系统版本不一样而采用不一样的值,目前测试版本是16.6ms这样最高的刷新的帧率就控制在60FPS之内);

若是没有以上事件的时候一样也会运行这样一个Loop;

这个Loop在1s以内运行了多少次,便可以表示当前App绘制的最高的能力,也就是Android App卡顿的程度;

另外,在一次Loop时若是执行时间超过了16.6ms,那么用多于16.6ms的时间除以16.6ms,便是当前App的丢帧(SF: Skipped Frame)。

2) 能够在Choreographer的回调FrameCallback中,按秒计数表示当前App的流畅程度,即流畅度SM(SMoothness)。

采用这样方式就能够在App内部观测当前App的流畅度了。而且在丢帧的地方打印traceView,就能够知道丢帧的大概缘由,大概位置。定位代码问题。

TestBird

相关文章
相关标签/搜索