安卓专项测试之GPU测试探索

ErmaOUSQ 8年前
   <h2><strong>背景</strong></h2>    <p>我们在安卓上进行性能测试时,如果想获取CPU以及内存等常用性能指标,linux系统自身就提供了现成的方法,谷歌官方甚至公司内部也都提供了大量功能强大的分析工具。而相比之下,想要获取GPU的相关指标则没那么容易,甚至我们对GPU应该使用什么指标衡量都几乎一无所知。这一方面是由于系统没有提供相关接口与命令,另一方面似乎业界目前对于GPU的关注度不足,相关积累与沉淀较少,鉴于此,个人感觉GPU测试这一块也可以作为终端专项后面需要关注及攻克的课题。</p>    <p>通过这两天的调研,笔者将GPU的测试方法简单的分为两类:</p>    <ol>     <li>安卓官方提供的工具及方法;</li>     <li>GPU厂商提供的工具及方法。下面将具体介绍这两类测试分析方法。</li>    </ol>    <h2><strong>一、安卓官方提供的工具</strong></h2>    <p>google或者百度“安卓GPU测试”等关键词搜索出来的结果多半属于这一类方法。这一类方法还有一个显著的共同点:没有提供GPU直接关键指标,而是通过逐帧计算界面绘制渲染的过程及消耗时间间接呈现GPU的占用。具体工具及使用方法如下:</p>    <p><strong>1. GPU View Updates</strong></p>    <p>开启方式:设置-开发者选项-显示GPU视图更新。主要查看view的更新以及redraw的区域大小。这个工具比较简单,不做具体介绍。</p>    <p><strong>2. Show GPU Overdraw</strong></p>    <p>开启方式:设置-开发者选项-调试GPU过度绘制-显示过度绘制区域。开启后的效果如下图:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/44959556ebf90739bd7888b069ae2bbe.jpg"></p>    <p>过度绘制(overdraw)指的是某些组件在屏幕像素点上绘制次数超过一次,不同颜色代表含义如下:</p>    <ul>     <li>无色:无过度绘制,即该像素点只绘制1次</li>     <li>蓝色:1倍过度绘制,即该像素点绘制了2次</li>     <li>绿色:2倍过度绘制,即该像素点绘制了3次</li>     <li>浅红:3倍过度绘制,即该像素点绘制了4次</li>     <li>暗红:4倍过度绘制,即该像素点绘制了5次</li>    </ul>    <p>在开发及测试的过程中,多倍过度绘制应该是需要特别注意并极力避免的。</p>    <p><strong>3. Profile GPU Rendering</strong></p>    <p>开启方式:设置-开发者选项-GPU呈现模式分析。</p>    <p>里面有两个选项:</p>    <ol>     <li>在屏幕上显示条形图;</li>     <li>在 adb shell dumpsys gfxinfo中。</li>    </ol>    <p>1、选择第一项,效果如下:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/71db43fa4b7ef58f3537dce10c691d2b.jpg"></p>    <p>手机上出现大量GPU绘制信息,每条柱状信息代表一帧渲染时间,柱子越长代表这一帧的渲染时间越长,不同颜色代表每一帧渲染各个阶段所占时长。为确保画面流畅,系统每秒钟需要渲染60帧(60fps),即平均每帧渲染时间为16ms,上图中的绿色横线即为16ms“警戒线”,超过这个警戒线的柱子代表该帧渲染时间过长,可能造成界面卡顿。</p>    <p>柱子不同颜色的组成代表了每一帧渲染各阶段耗时,在4.x的系统中,只分了3个阶段,而在5.x系统中细分成4个阶段,而在6.0系统中更进一步细分为了9个阶段,上图是6.0系统下呈现的效果,而在4.x系统下的呈现效果如下图所示:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/a03a317b8742ce6f1e751f67fbf7112e.jpg"></p>    <p>下面介绍各系统下不同颜色代表的含义:</p>    <p>4.x:</p>    <p>蓝色:代表绘制时间,即创建和更新display lists的时间 红色:代表执行时间,即系统进行2D渲染Display List的时间 橙色:代表处理时间,即CPU等待GPU完成渲染处理的时间</p>    <p>5.x:</p>    <p>新增紫色:代表渲染线程写入资源所需时间</p>    <p>6.x:</p>    <p>变成9种颜色,将渲染过程中的几大步骤进一步细分,可以通过Android Studio上的GPU Monitor可以看到各颜色含义更新如下(关于GPU Monitor下一小节会具体介绍):</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/e16861403dacac0a5141db883c19d4e1.png"></p>    <ol>     <li> <p>Swap Buffers:对应原先Process(橙色),表示处理任务的时间,也可以说是CPU等待GPU完成任务的时间,线条越高,表示GPU做的事情越多;</p> </li>     <li> <p>Command Issue:对应原先Execute(红色),表示执行任务的时间,这部分主要是Android进行2D渲染显示列表的时间,为了将内容绘制到屏幕上,Android需要使用Open GL ES的API接口来绘制显示列表,红色线条越高表示需要绘制的视图更多;</p> </li>     <li> <p>Sync & Upload:表示的是准备当前界面上有待绘制的图片所耗费的时间,为了减少该段区域的执行时间,我们可以减少屏幕上的图片数量或者是缩小图片的大小;</p> </li>     <li> <p>Draw:对应原先Update(蓝色),表示测量和绘制视图列表所需要的时间,蓝色线条越高表示每一帧需要更新很多视图,或者View的onDraw方法中做了耗时操作;</p> </li>     <li> <p>Measure/Layout:表示布局的onMeasure与onLayout所花费的时间,一旦时间过长,就需要仔细检查自己的布局是不是存在严重的性能问题;</p> </li>     <li> <p>Animation:表示计算执行动画所需要花费的时间,包含的动画有ObjectAnimator,ViewPropertyAnimator,Transition等等。一旦这里的执行时间过长,就需要检查是不是使用了非官方的动画工具或者是检查动画执行的过程中是不是触发了读写操作等等;</p> </li>     <li> <p>Input Handling:表示系统处理输入事件所耗费的时间,粗略等于对事件处理方法所执行的时间。一旦执行时间过长,意味着在处理用户的输入事件的地方执行了复杂的操作;</p> </li>     <li> <p>Misc Time/Vsync Delay:表示在主线程执行了太多的任务,导致UI渲染跟不上vSync的信号而出现掉帧的情况;出现该线条的时候,可以在Log中看到这样的日志:  I/Choreographer(*): Skipped XXX frames! The application may be doing too much work on its main thread</p> </li>    </ol>    <p>关于这一部分的具体原理及详细解释可以参考Android性能优化典范:</p>    <p><a href="/misc/goto?guid=4958862735850208803" rel="nofollow,noindex">http://hukai.me/android-performance-patterns/</a> <a href="/misc/goto?guid=4959672237552112170" rel="nofollow,noindex">http://hukai.me/android-performance-patterns-season-5/</a></p>    <p>2、选择第二项“adb shell dumpsys gfxinfo”,可以在终端中通过“adb shell dumpsy gfxoinfo taskName”命令获取对应进程的帧渲染日志文件。</p>    <p><strong>4. GPU Monitor</strong></p>    <p>另外,在Android Studio 1.4之后的版本中集成了GPU Monitor,也可以查看每帧的渲染耗时。使用方法如下:</p>    <p>将手机连接电脑病开启USB调试选项,打开Android Studio并点击底部的“Android Monitor”,选择待测的设备与进程,即可看到GPU Monitor的监控结果。以6.0系统为例,可以看到,GPU Monitor中呈现的信息实际上与GPU呈现模式分析中在手机屏幕上显示的柱状图是相同的。</p>    <p><img src="https://simg.open-open.com/show/dfe37eb3520abf357ce8e72dcaad52c8.jpg"></p>    <p>GPU Monitor中展示的柱状图的颜色数量也是与系统版本有关的,若使用5.x系统,GPU Monitor中渲染耗时展示如下:</p>    <p><img src="https://simg.open-open.com/show/d1da4ff8bd4a196ca61f2b83f40eee7c.jpg"></p>    <h2><strong>二、GPU厂商提供的工具</strong></h2>    <p>上面提到的方法都是通过监控帧渲染时间等手段间接反映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的工具:</p>    <ol>     <li>Adreno Profiler;</li>     <li>Trepn Profiler。</li>    </ol>    <p>其中,前者是PC端的工具,功能强大,但是使用相对复杂,因此如果测试人员只需要简单的测试数据,没有必要使用该工具。有兴趣的同学可以在网上检索资料,官方网站:</p>    <p><a href="/misc/goto?guid=4959714676886053008" rel="nofollow,noindex">https://developer.qualcomm.com/software/adreno-gpu-profiler</a> (复制链接在浏览器中打开)</p>    <p>本文主要介绍Trepn Profiler。Trepn Profiler是运行在终端上的性能监测工具,在应用宝等各大应用市场均能免费下载。</p>    <p>官方网站:</p>    <p><a href="/misc/goto?guid=4959714676987360167" rel="nofollow,noindex">https://developer.qualcomm.com/software/trepn-power-profiler。</a> (复制链接在浏览器中打开)</p>    <p>Trepn Profiler能够实时监测手机几项主要性能指标,主要包括CPU、内存、GPU、网络流量以及电量。其中GPU监测仅支持搭载高通处理器的设备,而其他功能可以在搭载任意处理器的手机上使用。Trepn Profiler使用起来也十分简单,下面主要介绍如何使用该工具监测并提取GPU数据。</p>    <p>首先打开Trepn Profiler,可以看到以下界面:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/ed415ff48e00541f99281666891fc198.jpg"></p>    <p>各个入口对应了不同的监测指标,以CPU监测为主,而GPU监测隐藏在“Performance Graph”中,点击该按钮并划到最下方:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/81de8d7a9d28c6c37cf4378274652b95.jpg"></p>    <p>同CPU占用一样,这里使用百分比表示了当前GPU的占用情况,刚好能够满足我们的需求,完美!但是,非高通机器在这里面是找不到GPU Frequency和GPU Load这两个指标的。然而这仅仅提供了一个折线图,如果想获取更详细信息,比如说原始数据以及各进程对应的GPU占用,没关系,Trepn Profiler同样能够满足。</p>    <p>回到首页,点击左上角选项按钮,选择“ADVANCED MODE”,进入以下界面:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/537d6bf2cd2e4636f36e2d9e939bafbb.png"></p>    <p>选择“Profile App”即可选择监测应用,在Setting中可以选择监测项目,采样频率等高级选项,同时还可以选择开启悬浮窗口实时监测。我们选择监测QQ空间直播过程中的GPU占用情况,并开启悬浮窗口实时监测GPU状态,如下图:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/33c96b22b7f3988901bc541fb9576cb2.jpg"></p>    <p>直播结束后,回到Trepn Profiler并选择“Stop Profiling”,会提示是否保存测试结果,选择“Save as .csv”,就可以保存测试过程中每次采样获得的原始数据。从手机中将csv格式的原始数据捞出来,可以用excel打开或者文本编辑器打开,可以根据后续需要自行选择数据处理方式。</p>    <p><img src="https://simg.open-open.com/show/96dd602fe7d08f8ae7af92e1117bd750.png"></p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/36bbda3dbc87d57aed220ddecba8a98f.jpg"></p>    <h2><strong>总结</strong></h2>    <p>本文记录了一个小白探索安卓GPU测试方法的过程并总结了现有的几个方法,但是笔者感觉本文总结的几个方法还是存在许多不足,并且对GPU测试相关也仍然存在一些疑问,例如:是否有公认统一的GPU测试衡量指标?第三方(非GPU厂商)能否做到跨硬件平台的、精确的GPU监控与测试?在专项测试关注的其他几个领域里,我们都建立了较完善的监控体系和工具集成,而相比之下,本文总结的GPU测试方法就显得过于简陋。随着当前直播业务的火爆以及未来VR/AR技术的逐步普及,将来会有越来越多的非游戏类应用涉及到较大规模的GPU运算。而目前我们专项测试乃至整个业界似乎对于GPU监控与测试的关注度还不够,所以最后也希望我们专项团队能够尽早完善GPU的测试方法以及监测体系。 笔者来自SNG质量部专项技术测试团队,由于本人刚入职还处于学习阶段,在性能/专项测试方面仍然资历尚浅,之前也没有接触过GPU以及图形学方面的知识,本文若有不准确不严谨不完善的地方,也请大家不吝赐教。</p>    <p> </p>    <p>来自:http://dev.qq.com/topic/57c7ffdc0569a1191bce8a63</p>    <p> </p>