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

Wear OS デバイスのバッテリー駆動時間を最大限に延ばすため、システムはメモリ使用量の計算を行います。Wear OS アプリの品質に関するガイドラインの一部として、Watch Face Format を使用するウォッチフェイスは、スマートウォッチの状態に応じて消費できるメモリ量が制限されます。

  • 常に画面表示モードでのメモリ消費量は 10 MB 以下に制限されます。
  • インタラクティブ モードでのメモリ消費量は 100 MB 以下に制限されます。

システムがウォッチフェイスのメモリ使用量を計算する

Watch Face Format を使用するウォッチフェイス内の画像またはビットマップ フォントのサイズを計算するために、システムは次の手順を実行します。

  1. 画像またはビットマップ フォントを解凍します。
  2. 画像またはビットマップ フォントを調べて、次のいずれかの方法で最適化できるかどうかを確認します。
    • 表示サイズに合わせてサイズを変更しました。
    • 完全に透明なピクセルを削除するように切り抜かれています。
    • 忠実度を損なうことなくダウンサンプリングできる場合は、RGB565 にダウンサンプリングします。

結果の境界ボックスに基づいて、システムは画像またはビットマップ フォントのサイズをバイト単位で計算します。計算方法は次のいずれかです。

  • RGBA8888 を使用する画像とフォントの場合: \( 4 \times width \times height \)
  • RGB565 を使用する画像とフォントの場合: \( 2 \times width \times height \)
  • ALPHA_8 ビットマップ構成を使用する画像とフォントの場合:\( width \times height \)

インタラクティブ モード

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

  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="40" y="40">
    <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="#123456" thickness="10" />
    </Arc>
</PartDraw>

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

ウォッチフェイスの針とウォッチフェイスの追加機能をソースファイルの末尾に配置する

XML ノードは、ソース XML ファイルにリストされている順序で描画されます。ウォッチハンドとウォッチフェイスの追加機能をファイルの最後に配置することで、常に画面表示モードのメモリ計算からレイヤ全体が除外されます。

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

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

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