本文来自于Dev Club 开发者社区,非经做者赞成,请勿转载,原文地址:http://dev.qq.com/topic/57c7f...linux
做者:章未哲——腾讯SNG质量部android
咱们在安卓上进行性能测试时,若是想获取CPU以及内存等经常使用性能指标,linux系统自身就提供了现成的方法,谷歌官方甚至公司内部也都提供了大量功能强大的分析工具。而相比之下,想要获取GPU的相关指标则没那么容易,甚至咱们对GPU应该使用什么指标衡量都几乎一无所知。这一方面是因为系统没有提供相关接口与命令,另外一方面彷佛业界目前对于GPU的关注度不足,相关积累与沉淀较少,鉴于此,我的感受GPU测试这一块也能够做为终端专项后面须要关注及攻克的课题。shell
经过这两天的调研,笔者将GPU的测试方法简单的分为两类:浏览器
安卓官方提供的工具及方法;性能优化
GPU厂商提供的工具及方法。下面将具体介绍这两类测试分析方法。微信
google或者百度“安卓GPU测试”等关键词搜索出来的结果多半属于这一类方法。这一类方法还有一个显著的共同点:没有提供GPU直接关键指标,而是经过逐帧计算界面绘制渲染的过程及消耗时间间接呈现GPU的占用。具体工具及使用方法以下:网络
开启方式:设置-开发者选项-显示GPU视图更新。主要查看view的更新以及redraw的区域大小。这个工具比较简单,不作具体介绍。app
开启方式:设置-开发者选项-调试GPU过分绘制-显示过分绘制区域。开启后的效果以下图:编辑器
过分绘制(overdraw)指的是某些组件在屏幕像素点上绘制次数超过一次,不一样颜色表明含义以下:工具
无色:无过分绘制,即该像素点只绘制1次
蓝色:1倍过分绘制,即该像素点绘制了2次
绿色:2倍过分绘制,即该像素点绘制了3次
浅红:3倍过分绘制,即该像素点绘制了4次
暗红:4倍过分绘制,即该像素点绘制了5次
在开发及测试的过程当中,多倍过分绘制应该是须要特别注意并极力避免的。
开启方式:设置-开发者选项-GPU呈现模式分析。
里面有两个选项:
在屏幕上显示条形图;
在 adb shell dumpsys gfxinfo中。
一、选择第一项,效果以下:
手机上出现大量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下一小节会具体介绍):
Swap Buffers
:对应原先Process(橙色),表示处理任务的时间,也能够说是CPU等待GPU完成任务的时间,线条越高,表示GPU作的事情越多;
Command Issue
:对应原先Execute(红色),表示执行任务的时间,这部分主要是Android进行2D渲染显示列表的时间,为了将内容绘制到屏幕上,Android须要使用Open GL ES的API接口来绘制显示列表,红色线条越高表示须要绘制的视图更多;
Sync & Upload
:表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减小该段区域的执行时间,咱们能够减小屏幕上的图片数量或者是缩小图片的大小;
Draw
:对应原先Update(蓝色),表示测量和绘制视图列表所须要的时间,蓝色线条越高表示每一帧须要更新不少视图,或者View的onDraw方法中作了耗时操做;
Measure/Layout
:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就须要仔细检查本身的布局是否是存在严重的性能问题;
Animation
:表示计算执行动画所须要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦这里的执行时间过长,就须要检查是否是使用了非官方的动画工具或者是检查动画执行的过程当中是否是触发了读写操做等等;
Input Handling
:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操做;
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性能优化典范:
二、选择第二项adb shell dumpsys gfxinfo
,能够在终端中经过adb shell dumpsy gfxoinfo taskName
命令获取对应进程的帧渲染日志文件。
另外,在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占用率或者相似的指标,就如同top命令能够直接查看CPU占用率同样,简单快捷。可是,多是因为相比CPU占用率,大部分开发者对GPU占用率并非十分关心,不只Linux/Android没有提供GPU占用指标,就连Windows上也没有提供原生的方法。Windows 平台上有一些第三方工具可以监测显卡状态,例如GPU-Z,暂时还不太清楚其工做原理及精确度。而在Linux/Android平台上彷佛还缺乏比较权威的第三方监测工具,Linux上能够经过Nvidia提供的nvidia-smi命令获取GPU参数,可是对其余GPU支持有限。在Android端,高通也提供了一些工具可以监测GPU的运行状况,可是也仅仅支持使用了高通CPU/GPU的移动设备。高通开发了两个可以监测GPU的工具:
Adreno Profiler;
Trepn Profiler。
其中,前者是PC端的工具,功能强大,可是使用相对复杂,所以若是测试人员只须要简单的测试数据,没有必要使用该工具。有兴趣的同窗能够在网上检索资料,官方网站:https://developer.qualcomm.co...(复制连接在浏览器中打开)
本文主要介绍Trepn Profiler。Trepn Profiler是运行在终端上的性能监测工具,在应用宝等各大应用市场均能免费下载。
官方网站:https://developer.qualcomm.co...(复制连接在浏览器中打开)
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以及图形学方面的知识,本文如有不许确不严谨不完善的地方,也请你们不吝赐教。
更多精彩内容欢迎关注腾讯优测的微信公众帐号: