Android 包含一些设备上的开发者选项,可以帮助您可视化您的应用在渲染其 UI 时可能遇到的问题,例如执行比必要更多的渲染工作或执行长时间的线程和 GPU 操作。本页介绍如何调试 GPU 过度绘制和分析 GPU 渲染。
要了解有关设备上的开发者选项的更多信息,包括如何启用它们,请阅读 配置设备上的开发者选项。
分析 GPU 渲染速度
分析 GPU 渲染工具以滚动直方图的形式显示 UI 窗口帧渲染所需时间的可视化表示,相对于每帧 16.67 毫秒的基准进行比较。
在功能较弱的 GPU 上,可用的填充率(GPU 填充帧缓冲区的速度)可能非常低。随着绘制帧所需的像素数量增加,GPU 可能需要更长时间来处理新命令,并要求系统其余部分等待它赶上来。分析工具可帮助您确定何时 GPU 在尝试绘制像素时不堪重负,或者因过度绘制过重而负担过重。
启用分析器
在您开始之前,请确保您正在使用运行 Android 4.1(API 级别 16)或更高版本的设备,并且您已 启用开发者选项。要开始在使用应用时分析设备 GPU 渲染,请按照以下步骤操作
- 在您的设备上,转到设置,然后点击开发者选项。
- 在监控部分,选择分析 GPU 渲染或分析 HWUI 渲染,具体取决于设备上运行的 Android 版本。
- 在分析 GPU 渲染对话框中,选择在屏幕上显示为条形以将图形叠加到设备屏幕上。
- 打开您想要分析的应用。
检查输出
在图 1 中显示的 Profile GPU Rendering 图表的放大图像中,您可以看到彩色部分,如 Android 6.0(API 级别 23)中所示。
以下关于输出的一些注意事项:
- 对于每个可见应用程序,工具都会显示一个图表。
- 水平轴上的每个垂直条代表一帧,每个垂直条的高度代表渲染该帧所需的时间(以毫秒为单位)。
- 水平绿色线代表 16.67 毫秒。为了达到每秒 60 帧,每帧的垂直条需要保持在此线以下。任何时候一个条超过这条线,动画中可能会有停顿。
- 该工具通过使相应的条更宽且透明度更低,突出显示超过 16.67 毫秒阈值的帧。
- 每个条都有彩色组件,映射到渲染管道中的一个阶段。组件数量因设备的 API 级别而异。
下表提供了在使用运行 Android 6.0 及更高版本的设备时,分析器输出中垂直条的每个段的描述。
条的组件 | 渲染阶段 | 描述 |
---|---|---|
交换缓冲区 | 表示 CPU 等待 GPU 完成其工作的时间。如果此条变高,则意味着应用程序在 GPU 上执行了过多的工作。 | |
命令发布 | 表示 Android 的 2D 渲染器用于向 OpenGL 发布命令以绘制和重绘显示列表的时间。此条的高度与每个显示列表执行所需时间的总和成正比——更多显示列表等于更高的红色条。 | |
同步和上传 | 表示将位图信息上传到 GPU 所需的时间。较大的段表示应用程序正在花费大量时间加载大量图形。 | |
绘制 | 表示用于创建和更新视图的显示列表的时间。如果条的这部分很高,则可能存在大量自定义视图绘制,或在 onDraw 方法中存在大量工作。 | |
测量/布局 | 表示在视图层次结构中 onLayout 和 onMeasure 回调上花费的时间。较大的段表示视图层次结构需要很长时间来处理。 | |
输入处理和动画 | 表示评估该帧运行的所有动画器并处理所有输入回调所需的时间。如果此段很大,则可能表示自定义动画器或输入回调花费了过多的时间进行处理。在滚动期间进行视图绑定,例如 RecyclerView.Adapter.onBindViewHolder() ,通常也发生在此段中,是此段中减速的更常见来源。 |
|
杂项时间/VSync 延迟 | 表示应用程序在两个连续帧之间执行操作所花费的时间。它可能表明 UI 线程中发生了过多的处理,这些处理可以卸载到另一个线程。 |
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 方法中存在大量工作。 |
有关如何解释分析工具提供的信息的更多信息,请阅读 使用 Profile GPU Rendering 进行分析。
注意:尽管此工具名为 Profile GPU Rendering,但所有监视的进程实际上都发生在 CPU 中。渲染通过向 GPU 提交命令来完成,而 GPU 异步地渲染屏幕。在某些情况下,GPU 可能有太多工作要做,而您的 CPU 必须等待才能提交新命令。当这种情况发生时,您将在橙色和红色条中看到峰值,并且命令提交将阻塞,直到 GPU 命令队列中腾出更多空间。
可视化 GPU 过度绘制
开发人员选项中的另一个功能通过对您的 UI 进行颜色编码来帮助您识别过度绘制。过度绘制发生在应用程序在同一帧内多次绘制相同的像素时。因此,此可视化显示了您的应用程序可能在做比必要更多的渲染工作的地方,这可能是一个性能问题,因为 GPU 需要额外的努力来渲染用户不可见的像素。因此,您应该尽可能地修复过度绘制事件。
如果您尚未执行此操作,请启用开发人员选项。然后,要在设备上可视化过度绘制,请执行以下操作:
- 在您的设备上,转到设置,然后点击开发者选项。
- 向下滚动到硬件加速渲染部分,然后选择调试 GPU 过度绘制。
- 在调试 GPU 过度绘制对话框中,选择显示过度绘制区域。
Android 使用 UI 元素颜色来识别过度绘制的程度,如下所示:
- 真实颜色:没有过度绘制
- 蓝色:过度绘制 1 次
- 绿色:过度绘制 2 次
- 粉色:过度绘制 3 次
- 红色:过度绘制 4 次或更多
请注意,这些颜色是半透明的,因此您在屏幕上看到的实际颜色取决于 UI 的内容。
既然您已经可以识别布局中发生过度绘制的位置,请阅读如何减少过度绘制。
请记住,某些过度绘制是不可避免的。在调整应用程序的用户界面时,请尝试找到一个显示大部分真实颜色或仅 1X 过度绘制(蓝色)的可视化效果。