表示オブジェクトのキャッシュ

Flash Player 9 以降、Adobe AIR 1.0 以降

Flash 内のデザインのサイズが大きくなると、アプリケーションの作成や、複雑なスクリプトで記述されたアニメーションの作成を行っている場合、パフォーマンスと最適化について考慮する必要があります。 静的な状態のままのコンテンツ(矩形の Shape インスタンスなど)がある場合、Flash Player および AIR によるコンテンツの最適化は行われません。したがって、矩形の位置を変更すると、Flash Player および AIR によって Shape インスタンス全体が再度描画されます。

指定した表示オブジェクトをキャッシュすることにより、SWF ファイルのパフォーマンスを向上させることができます。 表示オブジェクトはサーフェスであり、基本的にはインスタンスのベクターデータのビットマップバージョンです。このデータは、SWF ファイルの処理で大きく変更されることはありません。したがって、キャッシュがオンになっているインスタンスでは、SWF ファイルの再生中に連続的に再描画されることがないので、SWF ファイルのレンダリングが高速になります。

注意: サーフェスが再作成されるときに、ベクターデータを更新できます。 このため、サーフェス内にキャッシュされたベクターデータは、SWF ファイル全体で同じである必要はありません。

表示オブジェクトの cacheAsBitmap プロパティを true に設定すると、表示オブジェクト自体のビットマップ表現がキャッシュされます。Flash Player および AIR は、インスタンスのサーフェスオブジェクトを作成します。これは、ベクターデータではなくキャッシュされたビットマップです。表示オブジェクトの境界を変更すると、サーフェスはサイズ変更されるのではなく、再作成されます。 サーフェスは、他のサーフェス内にネストできます。 子サーフェスは、親サーフェス上にビットマップをコピーします。 詳しくは、 ビットマップキャッシュの有効化 を参照してください。

DisplayObject クラスの opaqueBackground プロパティと scrollRect プロパティは、 cacheAsBitmap プロパティを使用してビットマップキャッシュに関連付けられています。この 3 つのプロパティは互いに独立していますが、 opaqueBackground プロパティと scrollRect プロパティは、オブジェクトがビットマップとしてキャッシュされるときに最適に動作します。また、 opaqueBackground プロパティと scrollRect プロパティによってパフォーマンスが向上するのは、 cacheAsBitmap true に設定されている場合のみです。表示オブジェクトのコンテンツのスクロールについて詳しくは、 表示オブジェクトのパンとスクロール を参照してください。不透明な背景の設定について詳しくは、 不透明な背景色の設定 を参照してください。

cacheAsBitmap プロパティを true に設定する必要があるアルファチャンネルマスクについて詳しくは、 表示オブジェクトのマスク を参照してください。

キャッシュを有効にするシナリオ

表示オブジェクトのキャッシュを有効にすると、サーフェスが作成されます。これには、複雑なベクターアニメーションのレンダリングが速くなるなどいくつかの利点があります。 キャッシュを有効にしたいシナリオとして、いくつかの場合が考えられます。 常にキャッシュを有効にして SWF ファイルのパフォーマンスを向上させたい場合が考えられます。しかし、キャッシュを有効にしてもパフォーマンスが向上しない場合や、パフォーマンスが低下する場合もあります。 このセクションでは、キャッシュを使用する必要があるシナリオと、通常の表示オブジェクトを使用する必要があるシナリオについて説明します。

キャッシュされたデータの全体的なパフォーマンスは、インスタンスのベクターデータの複雑さ、変更するデータの量、および opaqueBackground プロパティを設定するかどうかによって異なります。小さな領域を変更する場合、サーフェスを使用したときとベクターデータを使用したときの違いは、ごくわずかです。 アプリケーションをデプロイする前に、両方のシナリオをテストする必要があります。

ビットマップキャッシュを使用するシナリオ

ビットマップキャッシュを有効にすることで大きな利点が得られる代表的なシナリオを次に示します。

  • 複雑な背景イメージ:ベクターデータの詳細で複雑な背景イメージ(「ビットマップのトレース」コマンドを適用したイメージや Adobe Illustrator® で作成したアートワークなど)を含むアプリケーション。背景で文字をアニメーション化することがあります。この場合、背景で連続的にベクターデータを再生成する必要があるため、アニメーションが遅くなります。 パフォーマンスを改善するには、背景の表示オブジェクトの opaqueBackground プロパティを true に設定します。これにより、背景はビットマップとしてレンダリングされるため素早く再描画でき、アニメーションの再生がより高速になります。

  • テキストフィールドのスクロール : スクロールテキストフィールドに大量のテキストを表示するアプリケーション。 スクロール境界( scrollRect プロパティ)によってスクロール可能に設定された表示オブジェクト内に、テキストフィールドを配置できます。これにより、指定したインスタンスの高速なピクセルスクロールが可能になります。 ユーザーが表示オブジェクトインスタンスをスクロールすると、Flash Player または AIR はスクロールされたピクセルを上方向に移動し、テキストフィールド全体を再生成するのではなく、新しく表示された領域だけを生成します。

  • ウィンドウシステム : 重なり合うウィンドウを持つ複雑なアプリケーション。 各ウィンドウは、開いて閉じることができます(Web ブラウザーウィンドウなど)。 各ウィンドウをサーフェスとしてマークした場合( cacheAsBitmap プロパティを true に設定することによりマーク)、各ウィンドウは分離されてキャッシュされます。ユーザーはウィンドウをドラッグできるため、互いに重ね合わせることが可能となり、各ウィンドウではベクターコンテンツの再生成は必要ありません。

  • アルファチャンネルマスク:アルファチャンネルマスクを使用する場合は、 cacheAsBitmap プロパティを true に設定する必要があります。詳しくは、 表示オブジェクトのマスク を参照してください。

これらのシナリオでビットマップキャッシュを有効にすると、ベクターグラフィックの最適化により、アプリケーションの応答性とインタラクティブ性が向上します。

また、表示オブジェクトに対してフィルターを適用するたびに、 cacheAsBitmap が(明示的に false に設定されている場合でも)Flash Player によって自動的に true に設定されます。表示オブジェクトのすべてのフィルターをクリアすると、 cacheAsBitmap は最後に設定した値に戻ります。

ビットマップキャッシュの使用を避けるべきシナリオ

この機能を使用する状況を誤ると、SWF ファイルのパフォーマンスに悪影響を及ぼす可能性があります。ビットマップキャッシュを使用する場合は、次のガイドラインを覚えておく必要があります。

  • サーフェス(キャッシュを有効にした表示オブジェクト)を多用しないでください。 各サーフェスは、通常の表示オブジェクトより多くのメモリを使用します。サーフェスを有効にするのは、レンダリングのパフォーマンスを改善する必要がある場合のみにしてください。

    キャッシュされたビットマップは、通常の表示オブジェクトに比べてはるかに多くのメモリを使用します。 例えば、ステージ上の Sprite インスタンスのサイズが 250 ピクセル × 250 ピクセルの場合、通常の(キャッシュされていない)Sprite インスタンスでは 1 KB のメモリ使用量が、キャッシュされると 250 KB になることがあります。

  • キャッシュされたサーフェスのズームインは避けてください。 ビットマップキャッシュを多用しすぎると、大量のメモリが消費されますが(前の項目を参照)、特にコンテンツをズームインした場合にメモリ使用量が大きくなります。

  • 大部分が静的な(アニメーション化されていない)表示オブジェクトインスタンスに対しては、サーフェスを使用してください。 インスタンスのドラッグや移動はできますが、インスタンスのコンテンツのアニメーション化や大幅な変更は避ける必要があります (アニメーションや Video インスタンスを含む MovieClip インスタンスの場合、アニメーション化やコンテンツの変更が行われる可能性が高くなります)。 例えば、インスタンスの回転や変換を行うと、インスタンスはサーフェスからベクターデータ(またはその逆)へ変更されます。この処理は複雑なため、SWF ファイルに悪影響を与えます。

  • サーフェスとベクターデータを組み合わせると、Flash Player および AIR の処理量(そして場合によっては CPU の処理量も)が増加します。例えばウィンドウアプリケーションを作成するときなど、サーフェスをできる限りグループ化するようにしてください。

  • グラフィックが頻繁に変化するオブジェクトはキャッシュしないでください。表示オブジェクトの拡大/縮小、傾斜、回転、アルファの変更やカラーの変換の適用、子表示オブジェクトの移動、またはグラフィックプロパティを使用した描画を実行するたびに、ビットマップキャッシュが再描画されます。この処理がすべてのフレームで発生した場合、ランタイムでは、オブジェクトをビットマップに描画してからそのビットマップをステージ上にコピーする処理が必要となります。つまり、キャッシュされていないオブジェクトを単にステージに描画する場合と比較して、多くの処理が発生します。キャッシュと頻繁な更新とのパフォーマンスのトレードオフは、表示オブジェクトの複雑さとサイズによって変わるため、個別のコンテンツをテストする以外に判断する方法はありません。

ビットマップキャッシュの有効化

表示オブジェクトのビットマップキャッシュを有効にするには、 cacheAsBitmap プロパティを true に設定します。

mySprite.cacheAsBitmap = true;

cacheAsBitmap プロパティを true に設定すると、表示オブジェクトのピクセルが全体の座標に自動的に吸着します。SWF ファイルをテストすると、複雑なベクターイメージで実行されるアニメーションのレンダリングが大幅に速くなっていることがわかります。

cacheAsBitmap true に設定しても、次のうち 1 つまたは複数の条件に当てはまる場合、サーフェス(キャッシュされたビットマップ)は作成されません。

  • ビットマップの高さと幅のいずれかが 2880 ピクセルを超えている場合。

  • ビットマップが割り当てに失敗した場合(メモリ不足エラー)。

キャッシュされたビットマップの変換マトリックス

モバイルデバイス用の AIR アプリケーションでは、 cacheAsBitmap プロパティを設定する場合には必ず cacheAsBitmapMatrix プロパティを設定してください。このプロパティを設定すると、再レンダリングを実行せずに表示オブジェクトに広範囲の変形を適用できます。

mySprite.cacheAsBitmap = true; 
mySprite.cacheAsBitmapMatrix = new Matrix();

このマトリックスプロパティを設定すると、オブジェクトを再キャッシュせずに、表示オブジェクトに次のような追加の変形を適用できます。

  • ピクセルへの吸着なしの移動または平行移動

  • 回転

  • 拡大/縮小

  • 傾斜

  • アルファの変更(0~100 %の透明度)

これらの変形は、キャッシュされたビットマップに直接適用されます。