App性能测试——帧率
FPS帧率
无论是手机端还是PC
端,画面的流畅度一直被用户视为衡量应用视觉体验的重要标准。而对开发者来说,帧率(FPS)通常作为衡量应用是否流畅的标准。
一帧就是一副静止的画面,连续的帧就形成动画,我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的数量,也可以理解为图形处理器每秒钟能够刷新几次。每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象。
我们看到的早期动画片其实就是用一张张手绘图片连贯翻页制作而成的。当一张张独立图片切换速度足够快时,我们的眼睛就会以为这是连续的动作,这个就是视觉暂留现象。
FPS
即Frames Per Second
(每秒显示的帧数),用于测量显示帧数的度量。帧数为0
说明页面处于静止,只要画面动起来,这个帧数就会有变化,看一张图直观感受一下:
通过上图我们能看出FPS
值的大小对画面流畅度的影响,每一帧都是静止的图像,快速连续地显示帧便形成了运动的假象,因此高帧率可以得到更流畅、更逼真的动画。
何为帧延迟?卡顿如何造成的?
卡顿本质其实就是操作过程中的丢帧 , 本来一秒中画面需要更新 60
帧,但是如果这期间只更新了 30
帧 , 那么在用户看来就是丢帧了 , 主观感觉就是卡了 , 尤其是帧率波动 , 用户的感知会更明显. 引起丢帧的原因非常多, 有硬件层面的 , 有软件层面的 , 也有 App
自身的问题. 帧延迟的高低可以通过帧时间(Frame Time
)来判定。
Android FPS测试
adb 命令获取
环境准备
- 将设备连接到PC,输入
adb devices
可以查看到设备信息。 - 并且在设置-开发者选项-监控-GPU呈现模式分析-勾选上
In adb shell dumpsys gfxinfo
- 在
PC
上打开cmd
窗口,启动待测应用。
执行测试
- 使用如下命令可以获取设备当前打开的应用包名。
1
2adb shell dumpsys window|grep mCurrentFocus
mCurrentFocus=Window{e633a66 u0 com.youku.phone/com.youku.v2.HomePageEntry} - 在App上执行操作,操作完成之后。输入命令
adb shell dumpsys gfxinfo {app的包名} >{PC路径}FPS.txt
1 | adb shell dumpsys gfxinfo com.youku.phone > C:\Users\Shuqing\Desktop\fps.txt |
- 在PC导出的路径可以看到生成的数据文件
fps.txt
数据分析
- 打开
fps.txt
可以看到采集的原始数据如下所示,
1 |
|
Draw
: 表示在Java
中创建显示列表部分中OnDraw()
方法占用的时间。(单位:毫秒)Prepared
:代表的时间就是UI Thread
传送数据给Render Thread
所用的时间。Process
:表示渲染引擎执行显示列表所花的时间,view
越多,时间就越长Execute
:表示把一帧数据发送到屏幕上排版显示实际花费的时间。Draw +Prepared+ Process + Execute
= 完整显示一帧的时间 ,这个时间要小于16ms
才能保证每秒60
帧。
iOS 帧率测试
通过使用instruments
的core animation
工具,浏览网页或加载动画,查看帧数。注意:Xcode 9
之后打开CoreAnimation
选项(必须真机) 一般而言,当用户操作时,如果fps
帧数小于40
,则说明存在卡顿的情形。