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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

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

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

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

ウォッチフェイスのハードウェア アクセラレーションをリクエストする

CanvasRenderer を作成して canvasTypeCanvasType.HARDWARE として設定し、ウォッチフェイスのハードウェア アクセラレーションをリクエストします。

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

ウォッチフェイスが現時点でハードウェア アクセラレーションを使用しているかどうかは、開発者向けオプションまたは 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 という行があります。通常、このフレームデータが出力に表示される場合、ウォッチフェイスはアクセラレーション キャンバスを使用しています。それ以外の場合、Total frames rendered の数値(およびレポート内の他のフレームデータの数値)は通常 0 になります。

ただし、gfxinfo はアプリのフルパッケージに対して出力されるため、ハードウェア アクセラレーション キャンバス以外(アプリが構成画面に使用する Activity など)からフレーム時間情報が表示される場合があります。違いを見分けるには、ウォッチフェイスが表示可能な唯一のサーフェスであることを確認してから、adb shell dumpsys gfxinfo コマンドを再実行して、Total frames rendered の値が増加するかどうかを確認します。

おすすめの方法

ユーザーに可能な限り最適なエクスペリエンスを提供するには、以下のおすすめの方法に従ってください。

バッテリーの駆動時間を最大限に延ばす

ウォッチフェイスのアニメーションが長時間実行されている場合は、ハードウェア アクセラレーションを使用すると、デバイスのバッテリー駆動時間が大幅に短くなる可能性があります。ウォッチフェイスがフレームごとに描画しようとすると、この問題がさらに悪化する可能性があります。ユーザーに悪影響を与えないようにするため、ウォッチフェイスには長時間実行されるアニメーションを配置しないでください。このガイドラインはハードウェア アクセラレーションの使用に特化しているわけではありませんが、ハードウェア アクセラレーションを使用すると描画可能なフレーム数が増加するため、準拠することがさらに重要になっています。詳細については、アニメーションに関するおすすめの方法をご覧ください。

サポートされている描画オペレーションを使用する

一部の描画オペレーションは、ハードウェア アクセラレーションを使用している場合にサポートされません。サポートされていないオペレーションを使用する小さなコードパスがある場合は、ビットマップを使用するキャンバスを作成してから、canvas.drawBitmap() を使用してビットマップをウォッチフェイスのキャンバスに描画できます。

ハードウェア アクセラレーションを使用する際に互換性を維持する

ハードウェア アクセラレーションは、Android 9(API レベル 28)以降を搭載した Wear OS デバイスで利用できます。(ハードウェア アクセラレーションが利用できない)古いデバイスでの特定の描画オペレーションや、ハードウェア アクセラレーション キャンバスでサポートされていない描画オペレーションを回避する場合は、Canvas.isHardwareAccelerated() で代替機能を確認できます。