前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)?

专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)?

原创
作者头像
霍格沃兹测试开发
发布于 2022-05-23 10:06:05
发布于 2022-05-23 10:06:05
1.7K0
举报
文章被收录于专栏:测吧测试开发测吧测试开发

本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群。

FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数据,进行计算从而获取测试结果。

前置业务知识

在此之前,需要先了解屏幕展示绘制过程及 Android 的 VSync 机制 VSync 全称是 Vertical Synchronization(垂直同步),在 Android 4.1 中引入 Android 系统(同时引入的一个概念是 Triple Buffering)。

学计算机的经常听到 Buffer 的概念(生活中也碰到过很多),起到的都是一个类似的作用。用来协调两个不同速度的东西工作。

举个实例,假设显示内容和绘制使用的是用一块内存,那可能会出现下面的问题。显示有截断的异常(图中的Tear Point #1和Tear Point #2)。

为什么会这样呢?因为 CPU/GPU 处理和屏幕展示的速度不一样但是却使用的是同一块内存。

在这里插入图片描述

怎么解决呢?可以将 CPU/GPU 处理和屏幕展示分开,CPU/GPU 在后台处理,处理完一帧的数据以后才交给屏幕展示(这样可能导致另外的问题是,如果 CPU/GPU 处理很慢,那么屏幕可能会一直展示某一帧的数据,下面主要分析这个问题的处理)。

绘制过程中的两个概念。

  • 手机屏幕刷新率:手机硬件每秒刷新屏幕的次数,单位 HZ。一般是一个固定值,例如 60HZ。
  • FPS:画面每秒传输帧数,通俗来讲就是指动画或视频的画面数。单位 HZ。

手机屏幕刷新率是固定的,FPS 则是一直变化的,怎么才能保证能够运行流畅呢?从几个例子来看吧。

先解释图片代表的意思:最下面黑线代表的是时间,黄色代表屏幕展示,绿色代表 GPU 处理,蓝色代表 CPU 处理。Jank 代表的是重复展示上一帧的异常。下面会从屏幕展示的每一帧开始分析:

没有引入 VSync 机制

上图是没有引入VSync 机制的处理流程。

Display 展示第0帧数据,这时 CPU/GPU 会去处理第1帧的数据。 Display 展示第1帧数据(此时屏幕显示是正常的),这时 CPU/GPU 可能处理其他任务导致很晚才去处理绘制。 因为 CPU/GPU 没处理好第2帧的数据,所以 Display 还是展示第1帧数据(此时屏幕显示是异常的),CPU/GPU 处理完第2帧没有处理完的数据然后继续处理第3帧的数据。 … 上图中一个很明显的问题是,只要一次 CPU/GPU 处理出现异常就可能导致后面的一系列的处理出现异常。

引入 VSync 机制

VSync 可以简单的认为是一种定时中断,系统在每次需要绘制的时候都会发送VSync Pulse 信号,CPU/GPU 收到信号后马上处理绘制。

正常情况

在4.1以后引入VSync 机制。

VSync机制的绘制

在 FPS < 手机屏幕刷新率的情况下,一切运行完美。

Double Buffering 异常情况

VSync 机制下 Double Buffering 时 FPS > 手机屏幕刷新率的情况。

VSync机制出现double buffering

Display 展示第A 帧数据,CPU/GPU 收到 VSync Pulse 信号马上处理B 帧的数据,但是由于计算太多,导致没有在一个 VSync 间隔内处理完。 由于第B 帧数据没有处理好,Display 继续展示第A 帧数据(此时屏幕显示是异常的)。由于系统中只存在一块内存给 CPU/GPU 处理绘制,所以在这个 VSync 间隔内cpu 不处理任何事。 Display 展示第 B 帧数据,CPU/GPU 收到 VSync Pulse 信号马上处理即将展示A 帧的数据,由于计算太多,导致没有在一个 VSync 间隔内处理完。 需要展示的A 帧数据没有处理好,Display 继续展示第 B 帧数据(此时屏幕显示是异常的)。由于系统中只存在一块内存给 CPU/GPU 处理绘制,所以在这个 VSync 间隔内 CPU 不处理任何事。 … 上图中一个很明显的问题是,只要出现一次Jank 就会影响下一次的VSync(cpu 不能工作)。

Triple Buffering 异常情况

Triple Buffering 的引入。

VSync机制出现triple buffering

Display 展示第A 帧数据,CPU/GPU 收到VSync Pulse 信号马上处理B 帧的数据,但是由于计算太多,导致没有在一个VSync 间隔内处理完。 由于第B 帧数据没有准备好,Display 继续展示第A 帧数据(此时屏幕显示是异常的)。此时虽然B 被gpu 在使用,但是cpu 可以处理Buffer C(因为有3个缓冲)。 Display 展示第B 帧数据,gpu 继续处理上一步骤的C,cpu 则处理A。 后续过程出错的情况被降低了…

获取数据并计算结果

1.运行命令"adb -s " + deviceName + " shell dumpsys gfxinfo " + packageName 获取基础数据,我们会获得很多数据,这里截取需要进行分析的部分:

注:如果运行完命令发现无上图中的4个参数,则很可能是手机的“GPU呈现模式分析”未打开;

在手机的开发者选项中,找到“GPU呈现模式分析”,选择“在adb shell dumpsys gfxinfo中”,如果是华为或荣耀的手机,则选择“在屏幕上显示为线型图”:

2.如上图信息表示了每一帧在安卓系统中的四个阶段:

Draw: 表示在Java中创建显示列表部分中,OnDraw()方法占用的时间 Prepare: 准备时间 Process:表示渲染引擎执行显示列表所花的时间,view越多,时间就越长 Execute:表示把一帧数据发送到屏幕上排版显示实际花费的时间,其实是实际显示帧数据的后台缓存区与前台缓冲区交换后并将前台缓冲区的内容显示到屏幕上的时间 将上面的四个时间加起来就是绘制一帧所需要的时间,如果超过了16.67就表示掉帧了

说明

Android 定义了流畅度的数据标准,以 60FPS 为标准(FPS 为每秒绘制的帧数),帧数过小就会出现卡顿感。

每一帧在安卓系统中分4个阶段,4个阶段的总和超过16.67(1秒60帧,算下来平均1帧的间隔就约是16.67ms)就认为丢帧。

这个定义在 Android6.0 以前是一定的,但是现在已经没有固定的标准了,因为目前安卓系统有3层缓存机制,加上硬件上的进步,即使超过16.67,也不一定会出现卡顿感。所以这个数据在测试时作为一种对比和相对衡量标准,也可根据需求自定义标准。

计算结果

通过以上数据,就可以获取到每一帧的时间、总帧数;从而就可以计算出 jank 数、vsync 数,进而就可以得到最终的 FPS 和丢帧率数据。

当然,手工计算无疑效率低,出错率大,所以这里的计算过程最好还是以脚本形式,让代码帮我们去计算,具体代码计算原理与专项自动化过程后续探讨。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数据,进行计算从而获取测试结果。
霍格沃兹测试开发
2020/09/03
1.6K0
专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
测试 App 流畅度
FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数据,进行计算从而获取测试结果。
霍格沃兹测试开发Muller老师
2022/12/01
5970
测试开发进阶(四十八)
https://github.com/google/battery-historian
zx钟
2019/12/20
5530
测试开发进阶(四十八)
Android 显示刷新机制、VSYNC和三重缓存机制
为了理解 APP 是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是 VSYNC。
全栈程序员站长
2022/08/31
2.7K0
Android 显示刷新机制、VSYNC和三重缓存机制
屏幕刷新机制简单问(没有代码,请放心享用)
本文起因呢,是因为周末在群里聊到关于屏幕刷新,同步屏障的问题,于是想到我们还没说过屏幕刷新方面的问题,就来聊聊了。新来的朋友如果有建议,想法也欢迎来微信讨论群讨论。(公众号首页—联系我—加讨论群)
码上积木
2021/01/11
1.9K0
屏幕刷新机制简单问(没有代码,请放心享用)
Android的16ms和垂直同步以及三重缓存
手机屏幕是由许多的像素点组成的,每个像素点通过显示不同的颜色最终屏幕呈现各种各样的图像。手机系统的类型和手机硬件的不同导致UI的流畅性体验个不一致。
蜻蜓队长
2018/08/03
2.9K0
Android的16ms和垂直同步以及三重缓存
APP性能测评分析
1.1流畅度相关概念 刷新率 vs 帧率 刷新率:美妙屏幕刷新次数,手机品目的刷新率是60HZ 帧率:GPU在一秒内绘制的帧率
用户10443079
2023/03/21
1.7K0
APP性能测评分析
“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
在Android中,当我们谈到 布局优化、卡顿优化 时,通常都知道 需要减少布局层级、减少主线程耗时操作,这样可以减少丢帧。如果丢帧比较严重,那么界面可能会有明显的卡顿感。我们知道 通常手机刷新是每秒60次,即每隔16.6ms刷新一次。 问题来了:
胡飞洋
2020/08/25
10.3K1
“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!
当我们讨论流畅度的时候,我们究竟在说什么?
前言:那些年我们用过的显示性能指标 相对其他 Android 性能指标(如内存、CPU、功耗等)而言,显示性能(包括但不仅限于我们常说的“流畅度”)的概念本来就相对复杂。让我们更蛋疼的是,业界对显示测试评估方式也是丰富多样,这无疑更加重了我们对其理解的复杂程度。 笔者简单搜集了一些业界中提及的显示性能指标,大家可以来品评一下: 指标名称:FPS 相关资料:Android性能测试之fps获取 指标名称:Aggregate frame stats(N 多个指标) 相关资料:Testing Display P
腾讯移动品质中心TMQ
2018/02/02
2.7K0
当我们讨论流畅度的时候,我们究竟在说什么?
Android系统16ms之内能做些什么
如果你觉得你的应用界面出现卡顿不流畅的情况,不用怀疑,这很大原因是你没有在16ms完成你的工作。没错,16ms要完成你的工作,再慢点,用户一定会吐槽,然后狠心把你辛辛苦苦开发出来的应用给卸载掉,你也不想想,人生有几个16ms可以浪费啊!
open
2020/03/19
1.2K0
Android系统16ms之内能做些什么
APP性能测试—帧率
无论是手机端还是PC端,画面的流畅度一直被用户视为衡量应用视觉体验的重要标准。而对开发者来说,帧率(FPS)通常作为衡量应用是否流畅的标准。
清风穆云
2021/08/09
3.7K0
HarmonyOS 开发实践——图像撕裂、掉帧等异常现象的原理以及优化方案
屏幕显示是通过类似逐行扫描而把图像显示到屏幕上,而其在底层则是通过一个帧缓存区映射到屏幕显示器上的。也就是通过CPU对图像的数据进行处理,交给显示处理器,显示处理器再处理成图像数据存储到帧缓冲区等待视频控制器的信号,将帧缓冲区的内容同步到显示器。
小帅聊鸿蒙
2024/11/06
1830
HarmonyOS 开发实践——图像撕裂、掉帧等异常现象的原理以及优化方案
Flutter深入浅出获取帧率
Flutter 中通过如下方式监听帧率,addTimingsCallback 涉及到帧调度知识,感兴趣可以看看这篇Flutter 帧调度过程。
睡觉谁叫
2023/01/13
4.3K0
Flutter深入浅出获取帧率
【学员干货】App常见性能测试点
(app除了这些性能测试,还有:手机版本号兼容性,屏幕分辨率兼容性,稳定性测试,安全测试等,后续会持续更新… 流量测试同这些一起更新,这里就不在说明了 )
新梦想IT职业教育
2019/10/22
3.4K0
【学员干货】App常见性能测试点
【MIG专项测试组】如何量化Android应用的“卡”?---流畅度原理&定义篇
腾讯Bugly特邀鹅厂MIG专项测试组,陆续为大家分享移动应用质量的有效评估方法。 MIG专项测试组 致力于为腾讯移动互联网事业群(MIG)提供专项评测及深度优化(性能、功能、安全等);同时负责探索新的测试理论和方法,研发评测工具及基础组件。 背景 在手机App竞争越来越激烈的今天,Android App的各项性能,如CPU、内存消耗等都有了客观的衡量指标。但对于App使用过程是否流畅,一直没有一个可靠的指标将用户的客观感受和数据一一对应。虽然之前有FPS(每秒帧数)作为游戏或视频类App的性能指标,
腾讯Bugly
2018/03/22
1.8K0
【MIG专项测试组】如何量化Android应用的“卡”?---流畅度原理&定义篇
Android 图形显示系统
本文讲解的内容是Android4.1以后的系统机制,将从整体上分析Android图形显示系统的结构,不深入分析每一层内部的代码实现,更多的是使用流程图和结构图来让大家理解Android是如何绘制、合成图形并显示到屏幕上。
字节流动
2021/04/23
1.8K0
Android 图形显示系统
Android Project Butter分析
一 背景知识介绍 随着时间的推移,Android OS系统一直在不断进化、壮大,日趋完善。但直到Android 4.0问世,有关UI显示不流畅的问题也一直未得到根本解决。在整个进化过程中,Android在Display(显示)系统这块也下了不少功夫,例如,使用硬件加速等技术,但本质原因似乎和硬件关系并不大,因为iPhone的硬件配置并不比那些价格相近的Android机器的硬件配置强,而iPhone UI的流畅性强却是有目共睹的。 从Android 4.1(版本代号为Jelly Bean)开始,Androi
xiangzhihong
2018/01/29
1.3K0
Android Project Butter分析
屏幕成像原理以及FPS优化Tips
移动端FPS优化已经是一个老生常谈的话题了,但在相当长一段时间内却一直是一个不过期的话题,除非硬件强大到可以帮我们抹平屏幕成像和渲染上的性能损耗。身为一个移动互联网从业者,对FPS的认识和优化依旧是很有限的,深感不安和羞愧,本文整理了之前的一些工作笔记,结合一些大牛们的优秀文章,希望能够起到复习和深化的作用。内容不实之处还请大家及时指出,感谢!
VV木公子
2020/03/20
9.7K0
扒一扒安卓渲染原理
导语: 在测试流畅度的过程中,必不可免的要与FPS,Jank等指标接触,但为了加深理解,今天来简单扒一扒安卓的渲染原理; PerfDog使用Jank作为来代表游戏流畅度的指标,详情可以看 APP&游戏需要关注Jank卡顿吗?
WeTest质量开放平台团队
2020/05/25
1.1K0
扒一扒安卓渲染原理
帧率相关知识
帧,就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。一帧就是一幅静止的画面,连续的帧就形成动画,如电视图图像等。
小柔
2022/10/09
8040
推荐阅读
相关推荐
专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档