检查 GPU 渲染速度和过度绘制

Android 包含一些设备上的开发者选项,可帮助您直观地查看应用可能会在哪些方面出现界面渲染问题,如执行不必要的渲染工作,或执行长时间运行的线程和 GPU 操作。本页介绍了如何调试 GPU 过度绘制以及如何进行 GPU 渲染模式分析。

如需详细了解设备上的开发者选项,包括如何启用它们,请阅读配置设备上的开发者选项

分析 GPU 渲染速度

GPU 渲染模式分析工具以滚动直方图的形式直观地显示渲染界面窗口帧所花费的时间(以每帧 16.67 毫秒的时间作为对比基准)。

在性能较低的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能很低。随着绘制一帧所需的像素数的增加,GPU 可能需要更长的时间来处理新命令,导致系统的其余任务等待,直到 GPU 可以跟上进度。

此分析工具可帮助您确定 GPU 何时因尝试绘制像素而不堪重负,或何时因大量的过度绘制而被拖累。

启用性能分析器

开始前,请确保您使用的是搭载 Android 4.1(API 级别 16)或更高版本的设备,并启用开发者选项。如需在使用应用时开始分析设备 GPU 渲染,请执行以下操作:

  1. 在您的设备上,转到设置并点按开发者选项
  2. 监控部分,选择 GPU 渲染模式分析HWUI 渲染模式分析,具体取决于设备上搭载的 Android 版本。
  3. 在“GPU 渲染模式分析”对话框中,选择在屏幕上显示为条形图,将图表以条形图的形式叠加在您设备的屏幕上。
  4. 打开您要分析的应用。

检查输出

在图 1 中显示的 GPU 渲染模式分析图形的放大图像中,您可以看到 Android 6.0(API 级别 23)上显示的彩色部分。

图 1. 放大的 GPU 渲染模式分析图形。

下面是有关输出的几点注意事项:

  • 对于每个可见应用,该工具将显示一个图形。
  • 沿水平轴的每个竖条代表一个帧,每个竖条的高度表示渲染该帧所花的时间(以毫秒为单位)。
  • 水平绿线表示 16.67 毫秒。若要实现每秒 60 帧,代表每个帧的竖条需要保持在此线以下。当竖条超出此线时,可能会使动画出现暂停。
  • 该工具通过加宽对应的竖条并降低透明度来突出显示超出 16.67 毫秒阈值的帧。
  • 每个竖条都有与渲染管道中某个阶段对应的彩色区段。区段数因设备的 API 级别不同而异。

下表介绍了在使用运行 Android 6.0 及更高版本的设备时,分析器输出中某个竖条的每个区段。

竖条区段渲染阶段说明
交换缓冲区 表示 CPU 等待 GPU 完成其工作的时间。如果此竖条升高,表示应用在 GPU 上执行了过多的工作。
命令问题 表示 Android 的 2D 渲染程序向 OpenGL 发出绘制和重新绘制显示列表的命令所花的时间。此竖条的高度与执行每个显示列表所花的时间的总和成正比。显示列表越多,红色竖条就越高。
同步和上传 表示将位图信息上传到 GPU 所花的时间。大区段表示应用花费大量的时间加载大量图形。
绘制 表示用于创建和更新视图显示列表的时间。如果竖条的此部分很高,表明可能有许多自定义视图绘制,或 onDraw 方法执行了很多工作。
测量/布局 表示在视图层次结构中 onLayoutonMeasure 回调上所花的时间。如果此区段很大,表示处理视图层次结构需要很长时间。
输入处理和动画 表示评估运行该帧和处理所有输入回调的所有动画程序所花的时间。如果此区段很大,可能表示自定义动画程序或输入回调的处理时间过长。滚动期间的视图绑定(例如 RecyclerView.Adapter.onBindViewHolder())通常也发生在此区段,这是导致此区段运行速度缓慢的更常见的原因。
其他时间/VSync 延迟 表示应用执行两个连续帧之间的操作所花的时间。它可能表示界面线程中进行的处理太多,而这些处理任务本可以分流到其他线程。

表 1. Android 6.0 及更高版本中的竖条区段。

4.0(API 级别 14)和 5.0(API 级别 21)之间的 Android 版本具有蓝色、紫色、红色和橙色区段。低于 4.0 的 Android 版本只有蓝色、红色和橙色区段。下表显示的是 Android 4.0 和 5.0 中的竖条区段。

竖条区段渲染阶段说明
处理 表示 CPU 等待 GPU 完成其工作的时间。如果此竖条升高,表示应用在 GPU 上执行的工作过多。
执行 表示 Android 的 2D 渲染程序向 OpenGL 发出绘制和重新绘制显示列表的命令所花的时间。此竖条的高度与执行每个显示列表所花的时间的总和成正比。显示列表越多,红色竖条就越高。
XFer 表示将位图信息上传到 GPU 所花的时间。如果此区段很大,表示应用花费大量的时间加载大量图形。 此区段在搭载 Android 4.0 或更低版本的设备上不可见。
更新 表示用于创建和更新视图显示列表的时间。如果竖条的此部分很高,表明可能有许多自定义视图绘制,或 onDraw 方法执行了很多工作。

表 2. Android 4.0 和 5.0 中的竖条区段。

如需详细了解如何解释分析工具提供的信息,请阅读使用 GPU 渲染模式分析工具进行分析

注意:尽管此工具名为“GPU 渲染模式分析”,但所有受监控的进程实际上发生在 CPU 中。通过将命令提交到 GPU 来触发渲染,GPU 也会异步渲染屏幕。在某些情况下,GPU 可能会有太多工作要处理,因此您的 CPU 必须先等待一段时间,然后才能提交新命令。如果发生这种情况,您将看到橙色竖条和红色竖条上出现峰值,且命令提交将被阻止,直到 GPU 命令队列中腾出更多空间。

直观呈现 GPU 过度绘制

这是开发者选项中的另一个功能,通过对您的界面进行彩色编码来帮助您识别过度绘制。当您的应用在同一帧中多次绘制相同像素时,便会发生过度绘制。因此,此图可显示您的应用可能在何处执行不必要的渲染工作,这可能是 GPU 多此一举地渲染用户不可见的像素所导致的性能问题。因此,您应尽可能修复过度绘制事件

如果您尚未执行此操作,请启用开发者选项。然后,如需在您的设备上直观呈现过度绘制问题,请按以下步骤操作:

  1. 在您的设备上,转到设置并点按开发者选项
  2. 向下滚动到硬件加速渲染部分,并选择调试 GPU 过度绘制
  3. 调试 GPU 过度绘制对话框中,选择显示过度绘制区域

Android 将按如下方式为界面元素着色,以确定过度绘制的次数:

  • 真彩色:没有过度绘制
  • 蓝色:过度绘制 1 次
  • 绿色:过度绘制 2 次
  • 粉色:过度绘制 3 次
  • 红色:过度绘制 4 次或更多次

图 2. 某个应用正常时的样子(左侧),以及它在 GPU 过度绘制后的样子(右侧)

请注意,这些颜色是半透明的,因此您在屏幕上看到的确切颜色取决于您的界面内容。

现在,您已经可以辨别出您的布局中何处出现了过度绘制,请阅读如何减少过度绘制

请注意,有些过度绘制是不可避免的。在优化应用的界面时,应尝试达到大部分显示真彩色或仅有 1 次过度绘制(蓝色)的视觉效果。

图 3. 大量过度绘制的应用(左侧)以及很少过度绘制的应用(右侧)的示例