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

Android 包含一些设备上的开发者选项,可帮助您直观了解您的应用在渲染其 UI 时可能遇到哪些问题,例如执行比必要更多的渲染工作,或执行长时间的线程和 GPU 操作。此页面介绍如何调试 GPU 过度绘制和分析 GPU 渲染。

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

分析 GPU 渲染速度

GPU 渲染分析工具以滚动直方图的形式显示 UI 窗口渲染帧所需时间的可视化表示,相对于每帧 16.67 毫秒的基准。

在性能较低的 GPU 上,可用填充率(GPU 填充帧缓冲区的速度)可能非常低。随着绘制帧所需的像素数量增加,GPU 处理新命令可能需要更长时间,并要求系统其余部分等待,直到它能够赶上。分析工具可帮助您识别 GPU 何时在尝试绘制像素时不堪重负,或因严重的过度绘制而负担过重。

启用分析器

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

  1. 在您的设备上,转到设置并点击开发者选项

  2. 监控部分,根据设备上运行的 Android 版本选择分析 GPU 渲染分析 HWUI 渲染
  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 延迟 表示应用在两个连续帧之间执行操作所花费的时间。它可能是 UI 线程中发生过多处理的指示器,这些处理可以卸载到其他线程。

表 1. Android 6.0 及更高版本中的组件条形。

Android 4.0(API 级别 14)和 5.0(API 级别 21)之间的版本具有蓝色、紫色、红色和橙色段。低于 4.0 的 Android 版本仅具有蓝色、红色和橙色组件。下表显示了 Android 4.0 和 5.0 中的组件条形。

条形组件渲染阶段描述
进程 表示 CPU 等待 GPU 完成其工作的时间。如果此条形变高,则表示应用在 GPU 上的工作量过大。
执行 表示 Android 的 2D 渲染器向 OpenGL 发出命令以绘制和重绘显示列表所花费的时间。此条形的高度与每个显示列表执行所需时间的总和成正比——显示列表越多,红色条形就越高。
传输 表示将位图信息上传到 GPU 所花费的时间。较大的段表示应用正在花费大量时间加载大量图形。此段在运行 Android 4.0 或更低版本的设备上不可见。
更新 表示用于创建和更新视图显示列表的时间。如果条形的这部分很高,则可能存在大量自定义视图绘制,或者在 onDraw 方法中存在大量工作。

表 2. Android 4.0 和 5.0 中的组件条形。

有关如何解释分析工具提供的更多信息,请阅读 使用分析 GPU 渲染进行分析

注意:虽然此工具名为分析 GPU 渲染,但所有监控的进程实际上都发生在 CPU 中。渲染是通过向 GPU 提交命令来完成的,GPU 异步地渲染屏幕。在某些情况下,GPU 的工作量可能过大,CPU 必须等待才能提交新命令。发生这种情况时,您会在橙色和红色条形中看到峰值,并且命令提交将被阻塞,直到 GPU 命令队列中有更多空间。

可视化 GPU 过度绘制

开发人员选项中的另一个功能通过对 UI 进行颜色编码来帮助您识别过度绘制。过度绘制是指应用在同一帧内多次绘制同一像素。因此,此可视化显示了应用可能正在执行比必要更多的渲染工作的位置,这可能是性能问题,因为 GPU 需要额外的精力来渲染用户看不到的像素。因此,应尽可能 修复过度绘制事件

如果尚未执行此操作,请 启用开发人员选项。然后,要在设备上可视化过度绘制,请按以下步骤操作。

  1. 在您的设备上,转到设置并点击开发者选项

  2. 向下滚动到硬件加速渲染部分,然后选择调试 GPU 过度绘制
  3. 调试 GPU 过度绘制对话框中,选择显示过度绘制区域

Android 对 UI 元素进行颜色编码以识别过度绘制量,如下所示。

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

图 2. 应用的正常显示(左)和启用 GPU 过度绘制后的显示(右)。

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

现在您可以识别布局中过度绘制的位置,请阅读 如何减少过度绘制

请记住,某些过度绘制是不可避免的。在调整应用的用户界面时,请尝试获得主要显示真彩色或仅 1 倍过度绘制(蓝色)的可视化效果。

图 3. 具有大量过度绘制(左)和少量过度绘制(右)的应用示例。