Profile GPU Rendering

Profile GPU Rendering是开发者选项中的另一个查看UI性能的工具。它可以查看当前页面的绘制性能,并直观地表示出来。

On Screen As Bars

这种方式是最直观的查看页面渲染性能的工具,在开发者选项中打开Profile GPU Rendering并选择On screen as bars即可,显示如图6.14所示。

Profile GPU Rendering - 图1 图6.14 绘图帧率

图6.14中有一条水平的绿线,该线即代表页面渲染流畅的16ms基线,高于该线即代表存在掉帧问题。下面各条柱状图,即代表每一帧的渲染时间,这里会产生三个时间(Android M上会有四个时间),分别是:

  • Draw表示绘制Display List的时间,一般来说也就是View.onDraw的时间。
  • Process图像引擎渲染Display List的时间,View树越深,渲染时间就越长。
  • Execute将一帧数据发送到屏幕图像合成器的时间。

Profile GPU Rendering - 图2Execute实际上是一个很复杂的时间。简单来说,可以理解为系统将一帧图像显示到显示屏上所花费的时间,它涉及三重缓冲的一些步骤。CPU与GPU对图像数据依次进行处理,同时它们之间有三个Frame的缓冲区。通常情况下,Execute的时间都非常短,但是如果GPU执行速度太慢,就会导致CPU等待GPU处理,使Execute时间变长。不过虽然这个Execute时间比较复杂,但开发者庆幸的是这个时间与应用层无关,通常与CPU和GPU的性能有关,由硬件决定。这也是上层应用开发者无法优化的部分。

通常情况下,判断一帧的绘制时间是按每一帧所有柱状图的总高度决定的,只有总高度在16ms基线以下才代表该帧流畅。而每一部分的柱状图高度,则可以作为分析时的参考,用于分析绘制耗时具体在哪一部分。

adb shell dumpsys gfxinfo

该指令与On Screen As Bars选项基本类似,唯一的不同是该指令可以获取完整的数据,常用于定量的分析,代码如下所示。

  1. ~ adb shell dumpsys gfxinfo > /Users/xuyisheng/Desktop/gfx.txt

通过这种方式,可以将前一段时间的渲染数据导出到gfx.txt中,文件内容如图6.15所示。

Profile GPU Rendering - 图3 图6.15 gfxinfo

这里的数据就是之前显示在屏幕上的柱状图数据,通过Excel可以将这些数据可视化,如图6.16所示。

Profile GPU Rendering - 图4 图6.16 gfxinfo数据

更重要的是,你可以根据这些数字做出不同的数据图。