Android专项测试之GPU测试

发表于:2016-11-16 11:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:章未哲    来源:51Testing软件测试网采编

  背景
  我们在安卓上进行性能测试时,如果想获取CPU以及内存等常用性能指标,linux系统自身就提供了现成的方法,谷歌官方甚至公司内部也都提供了大量功能强大的分析工具。而相比之下,想要获取GPU的相关指标则没那么容易,甚至我们对GPU应该使用什么指标衡量都几乎一无所知。这一方面是由于系统没有提供相关接口与命令,另一方面似乎业界目前对于GPU的关注度不足,相关积累与沉淀较少,鉴于此,个人感觉GPU测试这一块也可以作为终端专项后面需要关注及攻克的课题。
  通过这两天的调研,笔者将GPU的测试方法简单的分为两类:
  安卓官方提供的工具及方法;
  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呈现模式分析。
  里面有两个选项:
  在屏幕上显示条形图;
  在 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下一小节会具体介绍):
  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性能优化典范:
  http://hukai.me/android-performance-patterns/
  http://hukai.me/android-performance-patterns-season-5/
  2、选择第二项“adb shell dumpsys gfxinfo”,可以在终端中通过“adb shell dumpsy gfxoinfo taskName”命令获取对应进程的帧渲染日志文件。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号