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

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

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

分析 GPU 渲染速度

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

在性能较低的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能很低。随着绘制帧所需的像素数增加,GPU 可能需要花更长的时间来处理新命令,并要求系统的其余任务等待,直到系统可以跟上需求。此分析工具可帮助您确定 GPU 何时因尝试绘制像素而不堪重负,或何时因大量的过度绘制而被拖累。

启用分析器

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

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

检查输出

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

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

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

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

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

竖条区段渲染阶段说明
交换缓冲区 表示 CPU 等待 GPU 完成其工作的时间。如果此竖条升高,则表示应用在 GPU 上执行太多工作。
发出命令 表示 Android 的 2D 渲染程序向 OpenGL 发出绘制和重新绘制显示列表的命令所花的时间。此竖条的高度与执行每个显示列表所花的时间的总和成正比。显示列表越多,红色竖条就越高。
同步和上传 表示将位图信息上传到 GPU 所花的时间。大区段表示应用花费大量的时间加载大量图形。
绘制 表示用于创建和更新视图显示列表的时间。如果竖条的此部分很高,表明可能有许多自定义视图绘制,或 onDraw 方法执行的工作很多。
测量/布局 表示在视图层次结构中的 onLayoutonMeasure 回调上所花的时间。大区段表示处理视图层次结构需要很长时间。
动画 表示评估运行该帧的所有动画程序所花的时间。如果此区段很大,则表示您的应用可能在使用性能欠佳的自定义动画程序,或因更新属性而导致一些意料之外的工作。
输入处理 表示应用执行输入事件回调中的代码所花的时间。如果此区段很大,则表示应用花太多时间处理用户输入。不妨考虑将此类处理任务分流到其他线程。
其他时间/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 大区段表示应用花费大量的时间加载大量图形。此区段在运行 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. 某个应用经过大量过度绘制时的视觉效果(左侧)以及大大减少过度绘制后的视觉效果(右侧)的示例