feb19.jp

Nobuhiro Takahashi
Designer / Engineer

ランタイムビットマップキャッシュ(.cacheAsBitmap)

ランタイムビットマップキャッシュ(.cacheAsBitmap)

.cacheAsBitmapは使い所によっては凄く便利だと言うのは知っていて時々使っているのだけど、どうもよく分かっていなかったので、何故効果が現れないのか混乱することがしばしば(というか逆効果になったりするし)。というわけで頭の整理を行うために.cacheAsBitmapについてまとめてみました。

.cacheAsBitmapというのは、Flash Player 8から搭載された描画を高速にするためのMovieClip(またはButton)プロパティです。Boolean型です。mc.cacheAsBitmap = true;なんつって使います。

これがどういう処理を行っているかと言うと、詳しくは理解していないので中途半端な説明になってしまいますが、Flashはオブジェクトを描画する際に、毎フレームに渡って様々なプロパティ(位置やサイズ、拡大縮小、回転、色など)を計算し、それに基づいた上で画面に表示するためのビットマップデータを作成、つまりレンダリングを行います。そして最後に_visibleなどがtrueかfalseかによって表示を行うのですが、毎フレームプロパティを計算していたのでは、たとえば沢山のパス情報を持ったベクターグラフィックをモーションさせるさせると、処理が重くなってしまいます(パスの多いベクターグラフィックは計算が複雑なのです)。

そこで、.cacheAsBitmapを使うことで、一度レンダリングしたビットマップをキャッシュに残しておいて、前のフレームと同じであれば、再レンダリングを行わないで、キャッシュされたビットマップを使う、ということが可能になるのです。

しかしこの処理は処理で計算を持っていかれるので、使いどころを間違えると効果が現れないどころか、逆効果になってしまう場合があります。

拡大縮小を行ったり、回転などを行うと.cacheAsBitmapはこのMovieClipはキャッシュに残っているビットマップとは違うと判断し、再度レンダリングしなおします。そしてさらに.cacheAsBitmapはその新しく作成したビットマップをキャッシュに放り込みます。処理が余計増えていることがお気づきになると思います。

AS2.0ですと、「_alpha」、「_height」、「_rotation」、「_width」、「_xscale」、「_yscale」、「blendMode」、「filters」、「opaqueBackground」、「transform」などのプロパティが変化させられているとビットマップ化を再度行うので、これらを行わない「_x」と「_y」、つまり位置情報変化のみのモーションの場合は.cacheAsBitmapは効果を発揮します。

Flashドキュメンテーション「キャッシュを有効にする状況」を読むとより正確で詳しい情報が得られると思いますのでご一読ください。

.cacheAsBitmapについて検索していると、ムービークリップにBevelFilterやColorMatrixFilterなどのBitmapFilterを適用することで、.cacheAsBitmapが自動的にtrueに設定されると書かれている記事がありました(Flash Memo for Designers: キャッシュを有効にしてアニメーションを高速にする - cacheAsBitmap)。

フィルターを適用したMovieClipをアニメーションさせた場合、何故これほどまでに重いのかという原因がここにあるようです。

さらに.cacheAsBitmapを設定しているオブジェクトを透過したときに、内部のオブジェクトの透過処理が変わるという記事がありました(_quality | cacheAsBitmap設定時の特徴:透過処理)。

ベクターグラフィックを重ねて作ったイラスト(を閉じたムービークリップ)を透過させた場合、すごく気持ち悪いことになるのですが、.cacheAsBitmapを適用していると処理的にビットマップデータを透過するというかたちになるのでしょうか。

ちなみに.cacheAsBitmapは、ムービークリップやボタンのプロパティパネルにある、「ランタイムビットマップを有効にする」のチェックを入れることでtrueにすることも出来ます。

いやはやFlashは奥が深い。

Tweet Share Bookmark

Navigation

prev: Flash周りのキャッシュ対策
next: Flash RemotingとAMF

Recently Entries