ハードウェア アクセラレーションでウォッチフェイスのパフォーマンスを改善する

標準ビューを使用する Wear OS アプリでは、自動のハードウェア アクセラレーションによるグラフィック レンダリングが活用されています。ただし、ウォッチフェイスは通常、キャンバスを使用して実装されるため、ハードウェア アクセラレーションが自動的に適用されるわけではありません。

ウォッチフェイスでハードウェア アクセラレーション キャンバスを使用する理由

ほとんどの場合、ハードウェア アクセラレーション キャンバスを使用すると、ウォッチフェイスがより高いフレームレートでレンダリングされます。フレームレートを高い値に設定すると、アニメーションと遷移が滑らかに表示され、ユーザー エクスペリエンスが向上します。

ハードウェア アクセラレーション キャンバスを使用すると、ウォッチフェイスに関するその他の UI のパフォーマンス データにもアクセスできます。たとえば、UI パフォーマンスを測定するで説明されている詳細なフレーム情報には、ハードウェア アクセラレーション キャンバスを使用している場合にのみアクセスできます。

ウォッチフェイスがハードウェア アクセラレーションを使用しているかどうかを確認する

ウォッチフェイスがハードウェア アクセラレーションを使用しているかどうかは、開発者向けオプションまたは adb を使用して確認できます。

開発者向けオプションを使用して確認する

開発者向けオプションを使用してウォッチフェイスがハードウェア アクセラレーションを使用しているかどうかを確認する手順は次のとおりです。

  1. Wear OS デバイスで、[設定] > [開発者向けオプション] に移動します。
  2. [GPU プロファイリングをデバッグ] を有効にします。

    このオプションは、表示可能なサーフェスの上にオーバーレイを描画し(サーフェスごとに 1 つ)、対象サーフェスの 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 レベル 28)以降を搭載した Wear OS デバイスで利用できます。ハードウェア アクセラレーションが利用できない古いデバイスで特定の描画オペレーションを回避する方法、ハードウェア アクセラレーション キャンバスでサポートされていない描画オペレーションを回避する方法については、Canvas.isHardwareAccelerated() で代替機能をご確認ください。