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

Wear OS デバイスのバッテリー駆動時間を可能な限り長くするために、システムはメモリ使用量の計算を実行します。[Wear OS アプリの品質に関するガイドライン][1]の一環として、Watch Face Format を使用するウォッチフェイスでは、スマートウォッチの現在の状態に応じて消費できるメモリ量に制限があります。

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

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

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

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

結果として得られる境界ボックスに基づいて、画像またはビットマップ フォントのサイズ(バイト単位)が次のいずれかとして計算されます。

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

インタラクティブ モード

インタラクティブ モードのメモリ使用量を計算するときは、次の合計が計算されます。

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

設定

[configurations][6] を含むウォッチフェイスの場合、システムはさまざまな設定で使用されるリソースの合計サイズを計算しようとします。組み合わせが非常に多い場合、異なる構成で同時に使用されているリソースの数がわずかに過大評価されることがあります。

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

常に画面表示モードでは、スマートウォッチは最大 3 つの全画面レイヤを使用してレンダリングされると想定され、そのうちの 2 つは完全に静的なものです。

  1. ウォッチ要素の下のすべて。ウォッチフェイスの「本文」の大部分は、このレイヤに合成されます。このレイヤの描画に使用されている画像の数に関係なく、システムは 1 つのフルスクリーン画像としてカウントします。
  2. 動的にレンダリングされるプラットフォーム バインディングを含むウォッチハンド、デジタル ディスプレイ、ウォッチフェイスの追加機能。
  3. ソース XML ファイルでウォッチの針とウォッチフェイスの追加機能の後にリストされているすべての要素。

通常、常に画面表示モードでのメモリ使用量のほとんどは、ビットマップ フォント(特に大きいフォント)に起因します。

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

このセクションのおすすめの方法に沿うことで、メモリ使用量がこれらの制限内に収まるウォッチフェイスを作成できる可能性が高くなります。

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

画像と [BitmapFont][7] オブジェクトを切り抜き、表示サイズに合わせてサイズを変更します。

すべての画像は、Wear OS がウォッチフェイスを描画するときに解凍されます。ほぼ空白の全画面画像のディスク消費量は 3 KB ですが、450 ピクセル x 450 ピクセルの画面に表示する際には画像が解凍され、メモリ内での画像サイズは 750 KB 以上になります。

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

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

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

ウォッチフェイス全体で画像を移動するのではなく、画像内の要素を更新し、境界ボックスをウォッチフェイスに対して同じ位置に維持します。たとえば、ウォッチフェイス上の円をアニメーション化する場合は、ウォッチフェイス全体で円を回転させるのではなく、円の色を変更することを検討してください。

この方法では、システムがアニメーション用に計算する境界ボックスのサイズを小さくします。

画像の重複除去

ウォッチフェイスに同じ画像が複数表示される場合は、その画像のコピーを 1 つだけメモリに読み込み、その画像への参照を複数作成します。

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

1 分後や 1 時間後に完了する進行状況バーをエミュレートする場合でも、60 個の画像を別々に用意しないでください。代わりに、次のコード スニペットに示すように、長さを制御する式を含む [Arc][8] オブジェクトを作成します。

<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][9] オブジェクトのダッシュ プロパティを使用するか、半透明のマスク画像オーバーレイを使用します。

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

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

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

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

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