Skip to content

Most visited

Recently visited

navigation

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

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

如需了解有关设备上开发者选项的更多信息,包括如何启用它们,请阅读配置设备上开发者选项

分析 GPU 的渲染速度

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

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

注:此分析工具不适用于使用 NDK 的应用。 这是因为当 OpenGL 提取全屏上下文时,系统会将框架消息推送到后台。 在此情况下,您可能会发现 GPU 制造商提供的分析工具会很有帮助。

启用分析器

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

  1. 在您的设备上,转到 Settings 并点按 Developer Options
  2. Monitoring 部分,选择 Profile GPU Rendering
  3. 在 Profile GPU Rendering 对话框中,选择 On screen as bars 以在设备屏幕上叠加图表。
  4. 打开您要分析的应用。

检查输出

在图 1 中显示的放大的 Profile GPU Rendering 图表图像中,您会看到 Android 6.0(API 级别 23)上显示的彩色部分。

图 1. 放大的 Profile GPU Rendering 图表。

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

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

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

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

注: 尽管此工具名为 Profile GPU Rendering,但所有受监控的进程实际上发生在 CPU 中。 通过将命令提交到 GPU 触发渲染,GPU 异步渲染屏幕。 在某些情况下,GPU 会有太多工作要处理,在它可以提交新命令前,您的 CPU 必须等待。 在等待时,您将看到橙色条和红色条中出现峰值,且命令提交将被阻止,直到 GPU 命令队列腾出更多空间。

将 GPU 过度绘制可视化

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

如果您尚未执行此操作,请启用开发者选项。 然后,要在您的设备上可视化过度绘制问题,请执行以下操作:

  1. 在您的设备上,转到 Settings 并点按 Developer Options
  2. 向下滚动到 Hardware accelerated rendering 部分,并选择 Debug GPU Overdraw
  3. Debug GPU overdraw 对话框中,选择 Show overdraw areas

Android 按如下方法为界面元素设置颜色,以便确定过度绘制的次数:

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

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

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

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

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

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

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

在微信上关注 Google Developers

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)