ウォッチフェイスのメモリ使用量を最適化する

Wear OS は、メモリ使用量をトラッキングすることでバッテリー駆動時間を改善します。Wear OS アプリの品質に関するガイドラインに記載のとおり、Watch Face Format を使用するウォッチフェイスにはメモリ制限があります。

  • アンビエント モード: 最大メモリ使用量 10 MB。
  • インタラクティブ モード: 最大メモリ使用量 100 MB。

メモリ使用量の計算

Watch Face Format を使用してウォッチフェイス内の画像またはビットマップ フォントのメモリ使用量を計算するために、システムは次の処理を行います。

  1. 画像またはフォントを解凍します。
  2. 次の最適化が適用されているかどうかを確認します。
    • 画面に合わせてサイズ変更
    • 透明なピクセルを切り抜く
    • 忠実度を損なうことなく RGB565 にダウンサンプリング

結果のバウンディング ボックスに基づいて、サイズは次のように計算されます。

  • RGBA8888 を使用する画像とフォントの場合: 4 × 幅 × 高さ
  • RGB565 を使用する画像とフォントの場合: 2 × 幅 × 高さ
  • ALPHA_8 ビットマップ構成を使用する画像とフォントの場合: 幅 x 高さ

インタラクティブ モード

インタラクティブ モードのメモリ使用量を計算するために、システムは次の値を合計します。

  1. ベクター フォントの未処理のサイズ
  2. システムのデフォルト フォントの推定使用量
  3. 切り抜き、サイズ変更、再フォーマットの適用後の画像とビットマップ フォントの合計サイズ

設定

構成のあるウォッチフェイスの場合、システムはさまざまな構成にわたるウォッチフェイス リソースの合計サイズを計算しようとします。組み合わせの数が非常に多い場合、システムは同時に使用されるリソースの数を過大に見積もる可能性があります。

アンビエント モードとレイヤ

システムは、アンビエント モードが最大 3 つの全画面レイヤを使用し、そのうち 2 つが静的であると想定しています。レイヤには次のものがあります。

  1. ウォッチフェイスの背景。背景が複数の画像で構成されている場合でも、システムはこれを 1 つの画像として扱います。
  2. 針、デジタル ディスプレイ、動的要素などの可動部分。
  3. ソース XML ファイルの残りの要素。

アンビエント モードでは、大きなビットマップ フォントが最も多くのメモリを使用することがよくあります。

メモリ使用量を減らす方法

次の最適化を使用して、メモリ使用量を削減します。

ビットマップ フォントの切り抜きとサイズ変更

画像と BitmapFont オブジェクトを切り抜いて、表示サイズに合わせます。

Wear OS は、すべての画像を解凍してウォッチフェイスを描画します。ほぼ空白の全画面画像のディスク消費量は 3 KB ですが、450 ピクセル x 450 ピクセルの画面では 750 KB 以上になります。

ビットマップ フォントの高さを一定にする

BitmapFont を使用する場合は、各文字の画像の高さをすべて同じにする必要があります。同様に、単語の画像の高さもすべて同じにする必要があります。

アニメーションで一貫したフレームサイズを使用する

ウォッチフェイス全体で画像を移動するのではなく、画像内の要素を更新し、境界ボックスの位置を固定します。たとえば、文字盤の円をアニメーション化するには、円を回転させるのではなく、色を変更します。

この手法では、アニメーションの計算された境界ボックスのサイズが縮小されます。

画像の重複除去

画像を複数回表示するには、画像リソースを 1 つだけ含めて、それを複数回参照します。

進行状況を円弧で表示する

1 分後や 1 時間後に完了する進行状況バーをシミュレートする場合でも、60 個の画像を使用しないでください。次に示すように、長さを制御する式を含む Arc オブジェクトを使用します。

<PartDraw angle="0" width="400" height="400" name="ProgressBar"
    pivotX="0.5" pivotY="0.5" x="25" y="25">
    <Arc centerX="200" centerY="200" width="400" height="400"
        startAngle="0" endAngle="360">
        <!-- Completes a "progress loop" every minute. -->
        <Transform target="endAngle"
            value="0 + (clamp([SECOND], 0, 60) - 0) * 6" />
        <Stroke cap="ROUND" color="#654456" thickness="10" />
    </Arc>
</PartDraw>

連続した線として表示しない場合(たとえばレトロなデジタル スマートウォッチ スタイルにする場合)は、Stroke オブジェクトのダッシュ プロパティを使用するか、半透明のマスク画像オーバーレイを使用します。

ソースファイルの末尾に時計の針とコンプリケーションを配置する

XML ノードは、ソース XML に記載されている順序で描画されます。針とコンプリケーションを最後に配置することで、アンビエント モードのメモリ計算からレイヤ全体を削除できます。

ウォッチフェイスのメモリ使用量を評価する

ウォッチフェイスのメモリ使用量を測定するには、GitHub の watchface リポジトリにあるメモリ使用量エバリュエータ ツールを使用します。

  • 注: JavaScript がオフになっている場合はリンクテキストが表示されます
  • Arc
  • LINE
  • Rectangle