安卓 App 性能专项测试之流畅度深度解析-上篇
指标背景
流畅度,顾名思义是用户感知使用App页面时的流畅情况,“App卡不卡”,这是用户最直接的感受。
但是要用量化之后的数据衡量流畅度,在Android平台这边并没有直接有效的方式/手段去监控。
帧率&刷新频率
首先需要了解到两个概念:
刷新频率(Refresh Rate)
代表屏幕在一秒内刷新操作的次数,这取决于硬件的固定参数,例如60HZ。
帧率(Frame Rate)
代表GPU在一秒内绘制操作的帧数,例如常见的24fps,60fps,单位是fps(每秒帧数),很多游戏里面也会有这个指标。
24fps&60fps
现在电影行业默认的规则帧率是需要24fps,除了一些极个别的电影超高帧率之外(如李安的比利林恩.中场战事达到超高帧率120fps),辣么有的同学就问了:是不是帧率越高越好,这里可以给到你肯定的回答:是的!就像显示器的分辨率一样,之前认为1080p足够了,现在用到了4K,5K之后才发现以前的真没法看。当然支持高帧率也需要对应的硬件设备,emm..话题跑偏了,回到Android流畅度上来,现在Android平台App或者是游戏普遍需要达到60fps用户肉眼才能感觉到“不卡”。咦?不是24fps吗?那么问题来了,为什么电影只需要24fps就能是流畅的效果,而App/游戏需要达到60fps?
动态模糊
首先小伙伴们可以看下这张图,设计功力较渣,大家见谅

第一部分为电影物体运动轨迹,不理解,没关系,再来看下这张图

wtf???并不是电影不高清,而且主角在激烈的战斗啊!!!
怎么样,相信聪明如你应该懂了,电影每帧不仅会记录当前时间点的信息,还会记录物体的运行轨迹。所以我们看到是模糊的效果。
但是游戏/App的帧呢?请看下半部分,每帧只会记下当前时间点的信息,并不会记录物体的运行轨迹,每一帧都是清晰的,经过GPU渲染加载出来的。
所以动态模糊也是为什么电影只需要24fps的一个原因,那么除了动态模糊还有别的因素会影响的吗?
有的!
帧间隔/垂直同步/Vsync
说到帧间隔这个名词大家可能比较陌生,垂直同步相信很多玩游戏的小伙伴在游戏的设置菜单有见过,那么他是用来做什么的呢?
还是来看下面这张图:

可以看到在电影播放的时候,每帧的间隔时间都是相等的,过度非常平滑。
而在游戏帧/App帧,可能有些场景帧间隔时间较大(比如人民群众喜闻乐见的国民级手游王者荣耀在团战的时候),有些场景间隔时间较小(页面不复杂/简单应用场景),为什么会造成这个原因呢?
这得从App的渲染机制/原理讲起,CPU负责将页面的布局/元素进行计算将数据推给GPU进行处理,GPU负责进行栅格化(也就是将UI元素绘制到屏幕上),所以帧间隔时间跟页面结构复杂程度相关,页面结构越复杂,CPU/GPU所需要的时间越多。
讲到这里,可能有些同学马上想到是不是可以有某种技术可以让帧间隔的时间保持一致?没错,就是垂直同步!系统会每间隔一段时间发送一个Vsync同步信号,当接收到了Vsync就会刷FrameBuffer(简单理解就是去刷新屏幕显示),所以有了垂直同步可以解决掉帧间隔不同步的问题。但是事情往往不会这么简单的,有了垂直同步就可以高枕无忧了吗?并不会!
丢帧
虽然开启了垂直同步能够保证帧间隔时间相等,但是能够保证每帧都能够及时的渲染出来吗?并不能,来看下面这张图:

系统会每隔16ms去发送Vsync信号通知CPU/GPU可以开始渲染工作了,为什么是16ms?机智如你应该能想到60fps的倒数就是16.67ms(省略后面的小数点)。如果要能够达到60fps的话,那么就要求每一帧都应该在16ms之内绘制完毕,否则就出现了右边图里面的情况-丢帧!16ms之内没有完成该帧的绘制,那么就必须要等到下次系统的Vsync信号过来了,中间经过的时间就是16ms*2(大致为34ms)。而且丢帧也是App卡顿的根本原因!!!
好了,关于流畅度的解析就先到这里,下篇再给大家讲解怎么监控指标以及怎么测试的问题。
安卓 App 性能专项测试之流畅度深度解析-上篇的更多相关文章
- 安卓 App 性能专项测试之流畅度深度解析-中篇
背景 毫无疑问,流畅度在Android众多性能指标中其重要程度不言而喻,而且也是最为复杂的一个.为了描述这样的一个维度,业界大佬纷纷提出了各种指标来对其进行衡量.在上篇文章中给大家介绍了FPS这一项指 ...
- 安卓 App 性能专项测试指标之 CPU 深度解析
指标背景 很多场景下我们去使用App,可能会碰到手机会出现发热发烫的现象.这是因为CPU使用率过高.CPU过于繁忙,会使得整个系统无法响应用户,整体性能降低,用户体验变得相当差,也容易引起ANR等等一 ...
- Android性能专项测试之耗电量统计API
版权声明:本文为Doctorq原创文章,未经博主允许不得转载. https://blog.csdn.net/qhshiniba/article/details/49155979 参考文章:Androi ...
- Android App性能评测分析-流畅度篇
1.前言 在手机App竞争越来越激烈的今天,Android App的各项性能特别是流畅度不如IOS,安卓基于java虚拟机运行,触控响应的延迟和卡顿比IOS系统严重得多.一些下拉上滑.双指缩放快速打字 ...
- Android APP性能及专项测试
移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android的a ...
- Android APP性能及专项测试(个人整理)
移动测试. Android测试 .APP测试 Android篇 1. 性能测试 Android性能测试分为两类:1.一类为rom版本(系统)的性能测试2.一类为应用app的性能测试 Android ...
- 测开之Python自动化全栈工程师+性能专项(送思维导图)
测开之Python自动化全栈工程师+性能专项 功能测试基础 接口测试基础接口的通信原理与本质cookie.session.token详解接口测试的意义与测试方法接口测试用例的设计 app测试 app流 ...
- 专项测试实战 | 如何测试 App 流畅度(基于 FPS 和丢帧率)
本文为霍格沃兹测试学院学员学习笔记. FPS 和丢帧率可以在一定程度上作为 APP 流畅度的一项衡量标准,本文介绍利用 adb shell dumpsys gfxinfo 命令获取软件渲染加载过程的数 ...
- 【腾讯优测干货分享】安卓专项测试之GPU测试探索
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲——腾讯SNG质 ...
随机推荐
- js的类型系统--js基于原型的基石是所有对象最终都能够类型自证
一.动态类型 变量能够类型自证的类型即为动态类型 二.基础与内置类型 三.对象与类型的关系 1.对象本身能够自证为基本类型: 2.元原型可能为一个空的集合: 3.复合对象的成员能够自证为基本类型: 4 ...
- Linux正则表达式与通配符
在linux中,有通配符和正则表达式,这是两个不同的概念通配符:它是由shell解析,并且一般用于匹配文件名.如:ls正则表达式:是一个字符匹配标准,可以匹配文本中的内容一些命令工具按此标准实现字符匹 ...
- 分布式任务平台XXL_JOB
目录 1.源码下载地址 2.文档地址 3.源码结构 4.初始化数据库 5.配置调度中心 ①.修改调度中心配置文件 ②.部署调度中心 ③.访问调度中心管理界面 6.创建执行器项目 ①.添加maven依赖 ...
- EasyExcel引入
好久没更了,都在有道云上面记录,没时间搬过来. easyexcel是最近项目做优化涉及的一个改善点吧. 简介 导出是后台管理系统的常用功能,当数据量特别大的时候会内存溢出和卡顿页面,曾经自己封装过一个 ...
- spark学习收集
spark优化: http://www.cnblogs.com/hark0623/p/5533803.html 董西成学生写的经验分享(很详细很强大) spark官网 API http://spark ...
- s3-sftp-proxy goreleaser rpm &&deb 包制作
上次写过简单的s3-sftp-proxy基于容器构建以及使用goreleaser构建跨平台二进制文件的,下边演示下关于 rpm&&deb 包的制作,我们只需要简单的配置就可以生成方便安 ...
- Install Python3.6 on Amazon Linux/EC2 在Amazon Linux实例中安装使用Python3.6
本文转载自 https://gist.github.com/niranjv/f80fc1f488afc49845e2ff3d5df7f83b 由于Amazon Linux中预装的Python版本为2. ...
- linux高性能服务器编程 (九) --I/O复用
第九章 I/O复用 I/O复用就是一个线程可以同时监听多个文件描述符,提高程序性能.虽然I/O复用可以同时监听多个文件描述符,但是它本身是阻塞的,如果多个文件描述符准备就绪,如果不采取措施它仍然是串行 ...
- 【转】vim复制与粘贴
用vim写代码时,经常遇到这样的场景,复制多行,然后粘贴. 这样做:1. 将光标移动到要复制的文本开始的地方,按v进入可视模式.2. 将光标移动到要复制的文本的结束的地方,按y复制.此时vim会自动将 ...
- [技术博客]采用Qthread实现多线程连接等待
采用Qthread实现多线程连接等待 本组的安卓自动化测试软件中,在测试开始前需要进行连接设备的操作,如下图左侧的按钮 后端MonkeyRunner相关操作的程序中提供了connect() ...