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

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. watch 要素の下にあるすべて。ウォッチフェイスの「本文」の大部分はこのレイヤに合成されます。このレイヤの描画に使用された画像の数に関係なく、システムは 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 リポジトリにあるメモリ使用量エバリュエータ ツールを使用します。