作者:章未哲——腾讯SNG质量部

http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63

背景

我们在安卓上进行性能测试时,如果想获取CPU以及内存等常用性能指标,linux系统自身就提供了现成的方法,谷歌官方甚至公司内部也都提供了大量功能强大的分析工具。而相比之下,想要获取GPU的相关指标则没那么容易,甚至我们对GPU应该使用什么指标衡量都几乎一无所知。这一方面是由于系统没有提供相关接口与命令,另一方面似乎业界目前对于GPU的关注度不足,相关积累与沉淀较少,鉴于此,个人感觉GPU测试这一块也可以作为终端专项后面需要关注及攻克的课题。

通过这两天的调研,笔者将GPU的测试方法简单的分为两类:

  1. 安卓官方提供的工具及方法;
  2. GPU厂商提供的工具及方法。下面将具体介绍这两类测试分析方法。

一、安卓官方提供的工具

google或者百度“安卓GPU测试”等关键词搜索出来的结果多半属于这一类方法。这一类方法还有一个显著的共同点:没有提供GPU直接关键指标,而是通过逐帧计算界面绘制渲染的过程及消耗时间间接呈现GPU的占用。具体工具及使用方法如下:

1. GPU View Updates

开启方式:设置-开发者选项-显示GPU视图更新。主要查看view的更新以及redraw的区域大小。这个工具比较简单,不做具体介绍。

2. Show GPU Overdraw

开启方式:设置-开发者选项-调试GPU过度绘制-显示过度绘制区域。开启后的效果如下图:

过度绘制(overdraw)指的是某些组件在屏幕像素点上绘制次数超过一次,不同颜色代表含义如下:

  • 无色:无过度绘制,即该像素点只绘制1次
  • 蓝色:1倍过度绘制,即该像素点绘制了2次
  • 绿色:2倍过度绘制,即该像素点绘制了3次
  • 浅红:3倍过度绘制,即该像素点绘制了4次
  • 暗红:4倍过度绘制,即该像素点绘制了5次

在开发及测试的过程中,多倍过度绘制应该是需要特别注意并极力避免的。

3. Profile GPU Rendering

开启方式:设置-开发者选项-GPU呈现模式分析。

里面有两个选项:

  1. 在屏幕上显示条形图;
  2. 在 adb shell dumpsys gfxinfo中。

1、选择第一项,效果如下:

手机上出现大量GPU绘制信息,每条柱状信息代表一帧渲染时间,柱子越长代表这一帧的渲染时间越长,不同颜色代表每一帧渲染各个阶段所占时长。为确保画面流畅,系统每秒钟需要渲染60帧(60fps),即平均每帧渲染时间为16ms,上图中的绿色横线即为16ms“警戒线”,超过这个警戒线的柱子代表该帧渲染时间过长,可能造成界面卡顿。

柱子不同颜色的组成代表了每一帧渲染各阶段耗时,在4.x的系统中,只分了3个阶段,而在5.x系统中细分成4个阶段,而在6.0系统中更进一步细分为了9个阶段,上图是6.0系统下呈现的效果,而在4.x系统下的呈现效果如下图所示:

下面介绍各系统下不同颜色代表的含义:

4.x:

蓝色:代表绘制时间,即创建和更新display lists的时间红色:代表执行时间,即系统进行2D渲染Display List的时间橙色:代表处理时间,即CPU等待GPU完成渲染处理的时间

5.x:

新增紫色:代表渲染线程写入资源所需时间

6.x:

变成9种颜色,将渲染过程中的几大步骤进一步细分,可以通过Android Studio上的GPU Monitor可以看到各颜色含义更新如下(关于GPU Monitor下一小节会具体介绍):

  1. Swap Buffers:对应原先Process(橙色),表示处理任务的时间,也可以说是CPU等待GPU完成任务的时间,线条越高,表示GPU做的事情越多;

  2. Command Issue:对应原先Execute(红色),表示执行任务的时间,这部分主要是Android进行2D渲染显示列表的时间,为了将内容绘制到屏幕上,Android需要使用Open GL ES的API接口来绘制显示列表,红色线条越高表示需要绘制的视图更多;

  3. Sync & Upload:表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减少该段区域的执行时间,我们可以减少屏幕上的图片数量或者是缩小图片的大小;

  4. Draw:对应原先Update(蓝色),表示测量和绘制视图列表所需要的时间,蓝色线条越高表示每一帧需要更新很多视图,或者View的onDraw方法中做了耗时操作;

  5. Measure/Layout:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就需要仔细检查自己的布局是不是存在严重的性能问题;

  6. Animation:表示计算执行动画所需要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦这里的执行时间过长,就需要检查是不是使用了非官方的动画工具或者是检查动画执行的过程中是不是触发了读写操作等等;

  7. Input Handling:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操作;

  8. Misc Time/Vsync Delay:表示在主线程执行了太多的任务,导致UI渲染跟不上vSync的信号而出现掉帧的情况;出现该线条的时候,可以在Log中看到这样的日志:  I/Choreographer(*): Skipped XXX frames! The application may be doing too much work on its main thread

关于这一部分的具体原理及详细解释可以参考Android性能优化典范:

http://hukai.me/android-performance-patterns/http://hukai.me/android-performance-patterns-season-5/

2、选择第二项“adb shell dumpsys gfxinfo”,可以在终端中通过“adb shell dumpsy gfxoinfo taskName”命令获取对应进程的帧渲染日志文件。

4. GPU Monitor

另外,在Android Studio 1.4之后的版本中集成了GPU Monitor,也可以查看每帧的渲染耗时。使用方法如下:

将手机连接电脑病开启USB调试选项,打开Android Studio并点击底部的“Android Monitor”,选择待测的设备与进程,即可看到GPU Monitor的监控结果。以6.0系统为例,可以看到,GPU Monitor中呈现的信息实际上与GPU呈现模式分析中在手机屏幕上显示的柱状图是相同的。

GPU Monitor中展示的柱状图的颜色数量也是与系统版本有关的,若使用5.x系统,GPU Monitor中渲染耗时展示如下:

二、GPU厂商提供的工具

上面提到的方法都是通过监控帧渲染时间等手段间接反映GPU的状态,但是这些工具都不能满足我们的需求。其实我们的需求很简单:希望能够直接获得GPU占用率或者类似的指标,就如同top命令可以直接查看CPU占用率一样,简单快捷。但是,可能是由于相比CPU占用率,大部分开发者对GPU占用率并不是十分关心,不仅Linux/Android没有提供GPU占用指标,就连Windows上也没有提供原生的方法。Windows平台上有一些第三方工具能够监测显卡状态,例如GPU-Z,暂时还不太清楚其工作原理及精确度。而在Linux/Android平台上似乎还缺少比较权威的第三方监测工具,Linux上可以通过Nvidia提供的nvidia-smi命令获取GPU参数,但是对其他GPU支持有限。在Android端,高通也提供了一些工具能够监测GPU的运行情况,但是也仅仅支持使用了高通CPU/GPU的移动设备。高通开发了两个能够监测GPU的工具:

  1. Adreno Profiler;
  2. Trepn Profiler。

其中,前者是PC端的工具,功能强大,但是使用相对复杂,因此如果测试人员只需要简单的测试数据,没有必要使用该工具。有兴趣的同学可以在网上检索资料,官方网站:

https://developer.qualcomm.com/software/adreno-gpu-profiler(复制链接在浏览器中打开)

本文主要介绍Trepn Profiler。Trepn Profiler是运行在终端上的性能监测工具,在应用宝等各大应用市场均能免费下载。

官方网站:

https://developer.qualcomm.com/software/trepn-power-profiler。(复制链接在浏览器中打开)

Trepn Profiler能够实时监测手机几项主要性能指标,主要包括CPU、内存、GPU、网络流量以及电量。其中GPU监测仅支持搭载高通处理器的设备,而其他功能可以在搭载任意处理器的手机上使用。Trepn Profiler使用起来也十分简单,下面主要介绍如何使用该工具监测并提取GPU数据。

首先打开Trepn Profiler,可以看到以下界面:

各个入口对应了不同的监测指标,以CPU监测为主,而GPU监测隐藏在“Performance Graph”中,点击该按钮并划到最下方:

同CPU占用一样,这里使用百分比表示了当前GPU的占用情况,刚好能够满足我们的需求,完美!但是,非高通机器在这里面是找不到GPU Frequency和GPU Load这两个指标的。然而这仅仅提供了一个折线图,如果想获取更详细信息,比如说原始数据以及各进程对应的GPU占用,没关系,Trepn Profiler同样能够满足。

回到首页,点击左上角选项按钮,选择“ADVANCED MODE”,进入以下界面:

选择“Profile App”即可选择监测应用,在Setting中可以选择监测项目,采样频率等高级选项,同时还可以选择开启悬浮窗口实时监测。我们选择监测QQ空间直播过程中的GPU占用情况,并开启悬浮窗口实时监测GPU状态,如下图:

直播结束后,回到Trepn Profiler并选择“Stop Profiling”,会提示是否保存测试结果,选择“Save as .csv”,就可以保存测试过程中每次采样获得的原始数据。从手机中将csv格式的原始数据捞出来,可以用excel打开或者文本编辑器打开,可以根据后续需要自行选择数据处理方式。

总结

本文记录了一个小白探索安卓GPU测试方法的过程并总结了现有的几个方法,但是笔者感觉本文总结的几个方法还是存在许多不足,并且对GPU测试相关也仍然存在一些疑问,例如:是否有公认统一的GPU测试衡量指标?第三方(非GPU厂商)能否做到跨硬件平台的、精确的GPU监控与测试?   在专项测试关注的其他几个领域里,我们都建立了较完善的监控体系和工具集成,而相比之下,本文总结的GPU测试方法就显得过于简陋。随着当前直播业务的火爆以及未来VR/AR技术的逐步普及,将来会有越来越多的非游戏类应用涉及到较大规模的GPU运算。而目前我们专项测试乃至整个业界似乎对于GPU监控与测试的关注度还不够,所以最后也希望我们专项团队能够尽早完善GPU的测试方法以及监测体系。   笔者来自SNG质量部专项技术测试团队,由于本人刚入职还处于学习阶段,在性能/专项测试方面仍然资历尚浅,之前也没有接触过GPU以及图形学方面的知识,本文若有不准确不严谨不完善的地方,也请大家不吝赐教。

安卓专项测试之GPU测试探索相关推荐

  1. 【腾讯优测干货分享】安卓专项测试之GPU测试探索

    本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63 作者:章未哲--腾讯SNG质 ...

  2. app专项测试之兼容性测试

    文章末尾给大家留下了大量的福利 前言 昨天给大家唠了唠怎么测试app,那么今天笔者还想和大家来唠唠app的专项测试之兼容性测试,废话呢笔者就不多说了,直接进入主题. 1.APP兼容性测试认识 随着AP ...

  3. Android专项测试之崩溃测试(CPU)

    Android专项测试之崩溃测试(CPU) 崩溃问题类型 ❖ ANR:❖ 主线程5s内没响应 ❖ Java Crash: ❖ 未捕获的android vm异常 ❖ Native Crash: ❖ 未处 ...

  4. android测试篇(四)android专项测试之压力测试

    前言 抄袭文章来源:Android App专项测试-压力测试篇 小伙伴们大家好,今天主要分享的主题是Android App专项测试.如何进行Android App专项测试压力测试呢?我们主要通过And ...

  5. APP专项测试之耗电量测试

    一.耗电量测试分析 相对于PC端来说,移动设备的电池电量是非常有限的,保持持久的续航能力尤为重要.Android的很多特性都比较耗电(如屏幕.GPS.sensor传感器.唤醒机制.CPU.连网等的使用 ...

  6. APP 专项测试之兼容性测试

    1.APP 兼容性测试认识 随着 APP 应用范围越来越广,用户群体越来越大,终端设备的型号也越来越多,移动终端碎片化加剧,使得 APP 兼容性测试成为测试质量保障必须要考虑的环节. APP 兼容性测 ...

  7. 专项测试之Web测试

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 文章目录 一.电子商务站点的基本结构 1.电商平台的标准架构 2.电商平台的分布式多层结构 二.Web 测试的测试方法 1.Web ...

  8. app功耗测试软件,Android app专项测试之耗电量测试

    前言 耗电量指标 待机时间成关注目标 提升用户体验 通过不同的测试场景,找出app高耗电的场景并解决 01需要的环境准备 1.python2.7(必须是2.7,3.X版本是不支持的) 2.golang ...

  9. 专项测试之App测试

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 文章目录 一.手机 App 测试的范围 二.手机 App 测试的方法 1.功能模块测试 1.1 运行 1.2 应用的前后台切换 1 ...

最新文章

  1. 关于公示2019年度智源青年科学家征集评选结果的通知
  2. JNI中C调用Java方法
  3. 上海虹桥站 启动建设5G网络,DMA助力5G加速
  4. linux常用命令-查看文本/cat,tac,more,less,head,tail
  5. C++ class实现链栈(完整代码)
  6. (Docker实战) 第六篇:建立持续集成环境03
  7. android xml怎么建立,androidXmlSerializer创建XML文件
  8. NVIDIA ECCV18论文:超像素采样网络助力语义分割与光流估计(代码将开源)
  9. Windows下配置Nginx+php7
  10. Android AlarmManager实现不间断轮询服务
  11. springboot 访问远程服务器文件,springboot使用JSch远程读取sshd服务器上的文件
  12. 复制csdn或者博客园文章时,图片无法直接粘贴过来解决办法
  13. 天梯赛-愿天下有情人都是失散多年的兄妹-题解
  14. nginx 499错误原因及解决
  15. c语言easyx背景图片,C++之设置背景图片(Easyx)
  16. 个人项目-网络电话呼叫客户端 (一)
  17. C语言实现对一维数组所有元素排序,然后将m1到m2之间的元素逆序
  18. 云计算技术文章的创作心得
  19. Emlog程序百度熊掌号一键集成+自动推送插件
  20. 苹果换芯简史:芯片如何改变苹果的电脑产品线?

热门文章

  1. 【pacing 1】PACER模块、PacedSender 及关键参数
  2. [转]MVC整合Ajax
  3. DevExpress VCL v17.2.7全新发布|附下载
  4. HDU6386 Age of Moyu (2018多校第七场1001) (建虚点+堆优化dijkstra)
  5. 硬盘升级的理由 和老硬盘的处理
  6. android 如何打开s3db,Android开发教程:使用已有的SQL数据库
  7. linux搭建elasticsearch7.10集群及问题解决
  8. 我理解的现代控制系统-传递函数和时域卷积
  9. Java冒泡排序算法以及算法优化,这篇足矣……
  10. Webpack的HMR原理解析