App性能测试——帧率

FPS帧率

无论是手机端还是PC端,画面的流畅度一直被用户视为衡量应用视觉体验的重要标准。而对开发者来说,帧率(FPS)通常作为衡量应用是否流畅的标准。

一帧就是一副静止的画面,连续的帧就形成动画,我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的数量,也可以理解为图形处理器每秒钟能够刷新几次。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。

我们看到的早期动画片其实就是用一张张手绘图片连贯翻页制作而成的。当一张张独立图片切换速度足够快时,我们的眼睛就会以为这是连续的动作,这个就是视觉暂留现象。

FPSFrames Per Second(每秒显示的帧数),用于测量显示帧数的度量。帧数为0说明页面处于静止,只要画面动起来,这个帧数就会有变化,看一张图直观感受一下:

image

通过上图我们能看出FPS值的大小对画面流畅度的影响,每一帧都是静止的图像,快速连续地显示帧便形成了运动的假象,因此高帧率可以得到更流畅、更逼真的动画。

何为帧延迟?卡顿如何造成的?

卡顿本质其实就是操作过程中的丢帧 , 本来一秒中画面需要更新 60 帧,但是如果这期间只更新了 30 帧 , 那么在用户看来就是丢帧了 , 主观感觉就是卡了 , 尤其是帧率波动 , 用户的感知会更明显. 引起丢帧的原因非常多, 有硬件层面的 , 有软件层面的 , 也有 App 自身的问题. 帧延迟的高低可以通过帧时间(Frame Time)来判定。

Android FPS测试

adb 命令获取

环境准备

  1. 将设备连接到PC,输入adb devices可以查看到设备信息。
  2. 并且在设置-开发者选项-监控-GPU呈现模式分析-勾选上In adb shell dumpsys gfxinfo

dumpsys gfxinfo

  1. PC上打开cmd窗口,启动待测应用。

执行测试

  1. 使用如下命令可以获取设备当前打开的应用包名。
    1
    2
    adb shell dumpsys window|grep mCurrentFocus
    mCurrentFocus=Window{e633a66 u0 com.youku.phone/com.youku.v2.HomePageEntry}
  2. 在App上执行操作,操作完成之后。输入命令adb shell dumpsys gfxinfo {app的包名} >{PC路径}FPS.txt
1
adb shell dumpsys gfxinfo com.youku.phone   > C:\Users\Shuqing\Desktop\fps.txt
  1. 在PC导出的路径可以看到生成的数据文件fps.txt

数据分析

  1. 打开fps.txt可以看到采集的原始数据如下所示,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29


Total frames rendered: 2465 //本次dump搜集了2465帧的信息
Janky frames: 2451 (99.43%) //有2451帧超过了16ms.卡帧率是99.43%

Draw Prepare Process Execute
16.62 0.43 3.89 19.74
25.26 0.14 3.29 21.84
17.27 1.03 3.01 24.08
8.01 1.01 5.12 17.55
19.52 0.73 4.53 18.06
9.60 1.28 5.19 18.45
16.87 0.75 9.79 15.41
24.72 0.75 3.31 17.00
17.46 2.38 50.00 21.05
6.87 0.12 4.12 11.90
38.84 0.21 5.28 16.35
4.07 0.59 3.01 18.46
4.72 0.54 3.36 22.49
10.63 0.81 2.85 20.23
20.56 0.63 3.68 22.11
11.54 0.79 2.47 20.69
20.56 1.58 3.09 20.74
12.42 0.58 3.49 22.69
20.81 1.65 2.34 20.96
2.11 0.89 3.36 19.85
43.35 50.00 50.00 11.92
50.00 0.22 31.40 15.05
50.00 0.11 5.78 18.19
  • Draw: 表示在Java中创建显示列表部分中OnDraw()方法占用的时间。(单位:毫秒)
  • Prepared:代表的时间就是UI Thread传送数据给Render Thread所用的时间。
  • Process:表示渲染引擎执行显示列表所花的时间,view越多,时间就越长
  • Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间。
  • Draw +Prepared+ Process + Execute = 完整显示一帧的时间 ,这个时间要小于16ms才能保证每秒60帧。

iOS 帧率测试

通过使用instrumentscore animation工具,浏览网页或加载动画,查看帧数。注意:Xcode 9之后打开CoreAnimation选项(必须真机) 一般而言,当用户操作时,如果fps帧数小于40,则说明存在卡顿的情形。

ios-fps

参考资料