使用硬件加速提高表盘性能

使用标准视图的 Wear OS 应用可受益于自动硬件加速图形渲染。但表盘通常使用画布实现,因此它们无法自动获得硬件加速。

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

在大多数情况下,当使用硬件加速画布时,您的表盘会以更高的帧速率渲染。在更高的帧速率下,动画和过渡看起来更流畅,提供更好的用户体验。

当您使用硬件加速画布时,还可以访问更多关于表盘的 UI 性能数据。例如,只有在使用硬件加速画布时,才能访问测量 UI 性能中描述的详细帧信息。

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

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

使用开发者选项检查

要使用开发者选项检查您的表盘是否正在使用硬件加速,请按照以下步骤操作

  1. 在 Wear OS 设备上,导航到 Settings > Developer options
  2. 启用 Debug GPU profiling

    此选项会在可见表面上方绘制一个叠加层(每个表面一个),以显示该表面在 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 的行。通常,如果您的输出显示渲染的总帧数大于 0,则您的表盘使用加速画布。否则,报告中的渲染总帧数和其他帧数据通常为 0。

但是,由于 gfxinfo 是为您的应用完整软件包输出的,您可能会看到一些来自非硬件加速画布的帧时间信息,例如您的应用用于配置屏幕的 Activity。为了区分,请确保您的表盘是唯一可见的表面,然后重新运行 adb shell dumpsys gfxinfo 命令以检查 Total frames rendered 的值是否增加。

最佳实践

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

最大化电池续航

如果您的表盘有长时间运行的动画,使用硬件加速会大大降低设备的电池续航时间。如果您的表盘尝试在每一帧中绘制,这个问题会变得更糟。为了避免对您的用户产生负面影响,请不要在您的表盘中使用长时间运行的动画。此准则并非特定于使用硬件加速,但由于使用硬件加速会增加您可以绘制的帧数,因此遵循这一点更为重要。有关详细信息,请参阅动画最佳实践

使用支持的绘图操作

在使用硬件加速时,某些绘图操作不受支持。有关支持哪些操作的信息,请参阅硬件加速。如果您有一个使用不受支持操作的小代码路径,您可以创建一个位图支持的画布,然后使用 canvas.drawBitmap() 将该位图绘制到表盘的画布中。

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

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