无论是手机还是PC,屏幕的流畅程度一直被用户视为衡量应用程序视觉体验的重要标准。 用户常常通过主观感受将视觉体验分为两种状态:
视觉流畅:行云流水,一气呵成;
视觉不流畅:“口吃”、“抖动”、“呆滞”;
对于开发者来说,通常以FPS作为衡量应用是否流畅的标准。
1.什么是FPS?
FPS 代表 frames per Second(每秒显示的帧数),用于衡量显示帧数的度量。 帧号为 0 表示页面是静止的。 只要页面移动,帧数就会变化,然后就会趋于静止。 当页面滚动时,整体帧数会呈现“不对称”的抛物线趋势。 接下来看一张图直观感受一下:
从上图我们可以看出FPS值对画面流畅度的影响。 每一帧都是静止图像。 快速、连续地显示帧会产生运动的错觉。 因此,高帧速率可以产生更平滑、更真实的图像。 动画片。
2. 什么是帧延迟? 滞后是怎么造成的?
帧延迟的程度可以通过帧时间(frame Time)来确定。 我们参考显示器的60Hz刷新率来计算,也就是说每秒刷新60帧,每帧大约需要16.7毫秒。 如果图片中每一帧的生成时间非常接近16.7毫秒,那么整个图片的帧数就会非常稳定,更接近理想的每秒60帧。
计算公式:1000ms/60帧≈16.67ms/帧
如果每一帧的生成时间高于16.7毫秒帧数软件,就意味着渲染这个场景比其他帧需要更多的时间,导致画面跟不上,导致显示滞后。
举个简单的例子,我们早期看到的漫画,其实都是手绘图连页翻动而成的。 当单个图像切换得足够快时,我们的眼睛会将它们视为连续的动作。 相反,当画面切换速度不够快时,人眼就会看出瑕疵,相应的视觉体验就会滞后。
3. 如何进行应用帧率测试和测试需求以获得FPS的可行解决方案
在查阅了大量资料和研究了前辈同事的各种记录后,我根据自己的需求将可行方案的范围缩小到了三类。
设置完成后效果如下:
屏幕底部的条形图会不断刷新帧数软件,顶部会出现一条绿线,代表16ms阈值。 超过这个限制就说明当前帧的绘制时间出现延迟、卡顿。 其理由将在后面详细说明。 横坐标表示持续时间,每个条形表示当前帧的绘制时间。 因此,我们在使用的时候,下面的条形图会不断刷新,单位是ms。 大家有没有注意到,每一帧的条形图颜色都不一样(注:不同手机颜色不一样,仅供Android 4.0及以上版本参考)? 下图是官网提供的GPU渲染延迟的典型示例:
绘画过程中不同的颜色有不同的含义。 详细解释请前往>>官网查看更多。
那么是不是意味着我只需要打开界面,统计超过绿色阈值的直方图数量,就可以观察我们应用的流畅程度呢? 然而不行,因为这样获取的渲染时间只是UI主线程上的绘制行为。 我目前接手的项目是捕获相机数据,然后放入GPU进行绘图。 有一个单独的绘图线程。 ,一个单独的视图,所以这个解决方案不适合手头的项目。
1.确保手机与PC连接正常
2、打开手机的“设置”→“开发者选项”(如果没有开发者选项,点击“关于手机”和“版本号”,连续点击即可显示开发者选项)。 找到监控栏点击“GPU显示模式分析”→勾选“dab shell dumpsys gfxinfo”
3、PC端输入win+R进入运行,输入cmd,回车。将手机停放在正在测试的软件上
在命令行输入 adb shell "dumpsys window|grep mCurrentFocus 后,会显示应用程序的名称。只要记住名称以 com 开头,以“/”结尾即可。
4、打开待测应用,滑动页面。 完成后在命令行中输入adb shell dumpsys gfxinfo app package name>FPS.txt并回车。 如果页面没有任何提示,则表示成功。
5.打开“计算机”C:\Users\admin\fps.txt,
打开fps.txt文件,将其移动到显示较多数字的地方(如下图)。 您可以将这些数据复制到Excel表格中,并将其绘制成图标,以便于观察。
Draw:表示Java中onDraw()方法创建显示列表所花费的时间。
Process:表示渲染引擎执行显示列表所花费的时间。 观看次数越多,花费的时间就越长。
执行:表示将一帧数据发送到屏幕进行排版显示所需的实际时间。
绘制+处理+执行=完整显示一帧。 该时间必须小于 16 毫秒才能每秒保存 60 帧。
从图中可以看出,这款APP的流畅度还是不错的,帧率控制在16ms左右。 如果超过,则APP需要进一步优化。
7月福利班即将上线,有兴趣的关注一下吧~
班级地址: