利用硬件加速提升表盘性能

使用标准视图的 Wear OS 应用已经受益于硬件加速图形渲染。相比之下,表盘通常使用画布实现,因此不会自动获得硬件加速。

为何要为表盘使用硬件加速画布?

在大多数情况下,当使用硬件加速画布时,表盘将以较高的帧速率渲染。在较高的帧速率下,动画和过渡效果会更流畅。对用户来说,这些优势是不言自明的。

使用硬件加速画布时,您还可以访问有关表盘的更多界面性能数据。例如,当使用硬件加速画布时,您可以访问衡量界面性能中提到的详细帧信息。

为表盘请求硬件加速

创建 CanvasRenderer 并将 canvasType 设置为 CanvasType.HARDWARE 以请求为您的表盘启用硬件加速。

我的表盘是否在使用硬件加速?

您可以使用开发者选项或 adb 来检查表盘目前是否正在使用硬件加速。

使用开发者选项进行检查

如需使用开发者选项检查表盘是否在使用硬件加速,请按以下步骤操作:

  1. 在 Wear OS 设备上,依次访问设置 > 开发者选项
  2. 启用调试 GPU 性能剖析

    此选项会在可见 surface 之上绘制一个叠加层(每个 surface 一个叠加层)以显示该 surface 在 GPU 渲染的每个阶段所花费的时间。

  3. 在设备上,返回到您的表盘。

  4. 如果您的表盘正在使用硬件加速画布,您将看到表盘的每个渲染帧对应的新柱(从右向左移动)。

使用 adb 检查

如需使用 adb 检查表盘是否正在使用硬件加速,请按以下步骤操作:

  1. 在 Wear OS 设备上,将表盘更改为要测试的表盘。
  2. 让表盘在互动模式下运行几秒钟。
  3. 运行以下 adb 命令以检查表盘是否正在使用硬件加速:

    adb shell dumpsys gfxinfo [package-name]

运行该命令后,您会获得类似于以下示例的输出:

Applications Graphics Acceleration Info:
Uptime: 2239933 Realtime: 13568751

** Graphics info for pid 1100 [package-name] **

Stats since: 59875589194ns
Total frames rendered: 1213
Janky frames: 0 (0.00%)
50th percentile: 7ms
90th percentile: 18ms
95th percentile: 25ms
99th percentile: 150ms
Number Missed Vsync: 0
Number High input latency: 0
Number Slow UI thread: 0
Number Slow bitmap uploads: 0
Number Slow issue draw commands: 0
Number Frame deadline missed: 0

...

在此示例输出中,请注意显示 Total frames rendered 的行。通常,如果您在输出中看到此帧数据,则表示您的表盘正在使用加速画布。否则,Total frames rendered(报告中的其他帧数据数量)通常为零。

不过,由于 gfxinfo 是应用完整软件包的输出,因此您可能会看到除硬件加速画布以外的其他某些帧时间信息,例如应用为配置屏幕使用的 Activity。如需区分这两者,请确保表盘是唯一可见的 surface,然后重新运行 adb shell dumpsys gfxinfo 命令以验证 Total frames rendered 的值是否会增加。

最佳实践

请遵循以下最佳实践确保为用户提供最佳体验。

尽可能延长电池续航时间

如果您的表盘有长时间运行的动画,则使用硬件加速会大幅缩短设备的电池续航时间。如果表盘在每一帧中都尝试进行绘制,则此问题会更严重。为避免对用户造成负面影响,您的表盘中不应存在长时间运行的动画。本指南并非专门介绍使用硬件加速,但使用硬件加速会增加能够绘制的帧数,因此遵循最佳实践尤为重要。如需了解详情,请参阅动画最佳实践

使用受支持的绘图操作

使用硬件加速时不支持某些绘制操作。如果某个小代码路径使用了不受支持的操作,您可以创建一个基于位图的画布,然后使用 canvas.drawBitmap() 将该位图绘制到表盘的画布中:

在使用硬件加速时保持兼容性

硬件加速适用于搭载 Android 9(API 级别 28)或更高版本的 Wearuld OS 设备。如果您希望避免在旧款设备上(硬件加速不可用)执行特定绘制操作,或者希望在硬件加速画布上执行不受支持的绘制操作,您可以检查 Canvas.isHardwareAccelerated(),然后提供替代功能。