安卓 App 性能专项测试之流畅度深度解析-中篇

背景

毫无疑问,流畅度在Android众多性能指标中其重要程度不言而喻,而且也是最为复杂的一个。为了描述这样的一个维度,业界大佬纷纷提出了各种指标来对其进行衡量。在上篇文章中给大家介绍了FPS这一项指标的由来及卡顿的原理(丢帧),不熟悉的小伙伴可以点击进入http://www.lemfix.com/topics/245先去了解一番。
但是仅凭借fps指标来去衡量流畅度是远远不够的。

连续绘制的Android应用

对于连续绘制的应用(游戏、视频)我们可以选用fps指标。

步骤如下:

  • 将手机通过USB线连接之PC端,开发者选项中USB调试打开,保证adb devices能够检测到设备
  • 再次进入到开发者选项中,找到GPU呈现模式分析

  • 选择“在adb shell dumpsys gfxinfo中”

  • 查询自己要测试应用的包名,可有如下方式:

    1. app运行在前台,通过adb shell dumpsys activity | find "mFocusedActivity"查询
    2. aapt工具解析APK安装包,aapt dump badging APK安装包路径
    3. 等等...
  • 启动测试App应用,测试对应的场景,结束后在命令行输入adb shell dumpsys gfxinfo 应用包名

Draw+Prepare+Process+Execute=完整显示一帧的时间

这个时间需要小于16.67ms才能保证不丢帧

fps数据分析:

计算总数据的行数(跳过第一行)

frameCount=rowNum(总行数)

计算每帧的渲染时间

renderTime=Draw+Prepare+Process+Execute

当渲染时间renderTime大于16.67ms,该帧渲染超时,算一次丢帧,需要用掉额外的Vsync个数为(多需要的同步信号):

vsyncOverNum=renderTime/16.67-1

fps计算公式为

fps=frameCount*60 / frameCount+vsyncOverNum

非连续绘制的应用

实际上在现在很多的Android应用中,很少有需要不断的去绘制的场景。比如:

fps很低,为什么我们感觉不到卡顿?

因为本来就用不到那么高的fps,如画一个动画0.5秒就画完了,那么fps最高也就只有30帧/秒,而如果屏幕根本就没有绘制需求,即屏幕显示的画面是静止的,那fps就是为1。

还有一种情况是:app停止操作后,fps还一直变化,这样的话fps是否会影响fps准确性?

app停止操作后fps还一直变化,是因为屏幕每一帧的合成都是针对手机里的所有进程,那么即使你的App停止了绘制,手机里其他进程还可能在绘制,比如通知栏的各种消息,这会导致fps继续变化。

究竟如何衡量非连续绘制应用的流畅度?

在上一篇文章我们讲过Vsync信号会通知系统开始绘制并且显示在屏幕LCD上,如果某一个Vsync信号发过来绘制没有及时完成,那么Vsync会等到下一周期(16.67ms)再次发送。所以我们可以根据Vsync信号的发送来得到流畅度情况-SM(SMoothness)指标。

恰好有这样一款工具可以辅助我们得到-腾讯GT(前提是需要将手机root)

勾选要调试的进程

返回到参数界面可以看到SM参数已被勾选

点击红色按钮即可开始测试,场景测试完毕之后即可保存

得到的就是SM相关的数据。

posted @ 2019-06-19 15:07  歪歪欧巴  阅读(1118)  评论(0编辑  收藏  举报