ウォッチフェイスを最適化する

Wear OS のウォッチフェイスは継続的に動作するため、電力を効率的に使用する必要があります。

ウォッチフェイスのパフォーマンスは可能な限り最適化してください。このページでは、ウォッチフェイス全体の最適化に関するおすすめの方法や、アニメーションと画像を対象としたおすすめの方法を紹介します。

基本的な最適化

このセクションでは、ウォッチフェイスの全体的な効率を向上させるためのおすすめの方法を紹介します。

ウォッチフェイスの色と明るさ

ウォッチフェイスで暗い色を使用すると、ユーザーのスマートウォッチの消費電力を減らすことができます。ウォッチフェイスの背景の設定に関するおすすめの方法を以下に示します。これによりウォッチフェイスのバッテリー使用量を最適化できます。

  • 色: 可能であれば、黒い背景を使用します。
  • 明るさ: 黒い背景を使用できない場合は、背景色の明るさを、HSV または HSB(色相、彩度、明度)スケールで 25% 以下に維持します。たとえば、Color クラスを使用して背景色を設定し、HSV スケールで定義する場合は、明るさを制御する明度の設定に 25 以下を使用します。

動的な機能を使用してスマートフォンを操作する

ウォッチフェイスにスマートフォン上で動作する処理が必要な場合、ウォッチフェイスがアクティブなときにのみコードが実行されるようにします。スマートフォンのアプリで対応するウォッチフェイスがアクティブであることを確認できるようにするには、CapabilityClient API を使用することをおすすめします。

消費電力を監視する

デベロッパーやユーザーは Wear OS コンパニオン アプリを通じて、ウェアラブル デバイスの各種プロセスでのバッテリー消費量を確認できます。これは [設定] > [スマートウォッチの電池] に移動すると確認できます。

暗号化対応のウォッチフェイスを登録する

Android 7.0 以降はファイルベースの暗号化をサポートしており、ユーザーが起動時に復号パスコードを入力する前に暗号化対応アプリを実行できます。これにより、起動アニメーションからウォッチフェイスへの移行時間を最大 30 秒短縮できます。

起動時間を短縮できるようにするには、android:directBootAware="true" をウォッチフェイスのマニフェストに追加します。

注: この機能は、ウォッチフェイスで認証情報暗号化ストレージを使用しない場合に使用します。

アニメーションに関するおすすめの方法

このセクションのおすすめの方法を使用すると、アニメーションに関連する消費電力を削減できます。

アニメーションのフレームレートを下げる

アニメーションは多くの場合、計算コストが高く、大量の電力を消費します。ほとんどのアニメーションは 30 フレーム/秒でスムーズに見えるため、それより高いフレームレートで実行しないことをおすすめします。代わりに、動的フレームレートを使用できます。詳細については、キャンバス ウォッチフェイスの例をご覧ください。

アニメーションの合間に CPU をスリープさせる

バッテリー駆動時間を最大限に伸ばすために、アニメーションの使用を控えめにしてください。コロンの点滅でさえ、点滅のたびにバッテリーの電力を消費します。

アニメーションの実行や、ウォッチフェイスのコンテンツのわずかな変化でも、CPU のスリープが解除されます。アニメーションの合間は CPU をスリープさせましょう。たとえばインタラクティブ モードで、1 秒間隔で短いアニメーションを表示し、その合間に CPU をスリープさせます。CPU をこまめにスリープさせると、個々のスリープ時間は短くても消費電力を大幅に削減できます。

画像に関するおすすめの方法

このセクションのおすすめの方法を使用すると、画像に関連する消費電力を削減できます。

ビットマップ アセットのサイズを小さくする

ウォッチフェイスの多くは、背景画像と、変形され背景画像に重ねて表示されるその他のグラフィック アセット(時計の針のような徐々に移動する要素など)で構成されます。これらのグラフィック アセットはサイズが大きいほど、変形に必要な計算コストが高くなります。これらのグラフィック要素は通常、ウォッチフェイスを描画するで説明されているように、システムがウォッチフェイスを再描画するたびに Render.CanvasRenderer.render() メソッド内で回転と、場合によってはサイズ調整が行われます。

図 1. 時計の針を切り抜いて余分なピクセルを削除する。

ビットマップ アセットのサイズを小さくすることで、アニメーションのパフォーマンスを向上させ、バッテリーを節約することができます。以下のおすすめの方法を採用すると、ウォッチフェイスのパフォーマンスを向上させることができます。

  • 必要以上にサイズの大きなグラフィック要素を使用しない。
  • 周りの余分な透過ピクセルを削除する。

たとえば、図 1 の左側にある時計の針の画像は、図の右側に示すように余分な透過ピクセルを削除することで、サイズを 97% 小さくできます。

ビットマップ アセットを結合する

一緒に描画されることが多いビットマップがある場合は、それらを 1 つのグラフィック アセットに結合することを検討します。たとえば、多くの場合、インタラクティブ モードの背景画像を目盛りと結合することで、システムがウォッチフェイスを再描画するたびに 2 つの全画面ビットマップを描画する必要がなくなります。

サイズ調整されたビットマップを描画するときにアンチ エイリアスを無効にする

Canvas.drawBitmap() メソッドを使用して、サイズ調整されたビットマップを Canvas オブジェクト上に描画する場合、Paint インスタンスを使用して複数のオプションを設定できます。パフォーマンスを向上させるには、setAntiAlias() メソッドを使用してアンチ エイリアスを無効にします(このオプションはビットマップに対する影響がないため)。

図 2. ビットマップ フィルタリングを無効にした場合(左)と有効にした場合(右)の例。

ビットマップ フィルタリングを使用する

ビットマップ アセットを他の要素の上に描画する場合、setFilterBitmap() メソッドを使用して同じ Paint インスタンスに対するビットマップ フィルタリングを有効にします。図 2 は、ビットマップ フィルタリングを有効にした場合と無効にした場合の時計の針を拡大表示したものです。

注: 常に画面表示モードがアクティブになっているときは、ビットマップ フィルタリングを無効にしてください。低ビットの常に画面表示モードでは、システムで画像の色を確実にレンダリングすることができず、ビットマップ フィルタリングが正常に処理されません。

コストの高い処理を描画メソッドの外部に移動する

ウォッチフェイスを再描画するたびに、Render.CanvasRenderer.render() メソッドが呼び出されます。パフォーマンスを向上させるには、ウォッチフェイスの更新に本当に必要な処理のみがこのメソッドに含まれるようにします。

可能であれば、Render.CanvasRenderer.render() メソッド内で以下の処理を行わないようにします。

  • 画像やその他のリソースの読み込み
  • 画像のサイズ変更
  • オブジェクトの割り当て
  • フレーム間で結果が変わらない計算

ウォッチフェイスのパフォーマンスを分析するには、CPU Profiler を使用します。特に、Render.CanvasRenderer.render() 実装の実行時間が短く、また、各呼び出し間で実行時間が一定であることが重要です。詳細については、CPU Profiler を使用して CPU アクティビティを検査するをご覧ください。

ウォッチフェイス サンプルアプリでは、ウォッチフェイスを構成する際のおすすめの方法を紹介しています。