cacheAsBitmapの仕組み

ついつい使いたくなるcacheAsBitmapですが、内部的な動作は、次のようなものと
推測されます(パフォーマンス測定からの類推)。

1.コンポーネントと同じ大きさのbitmapDataを用意する。
2.bitmapData.draw(this)ですべて書き出す。
3.書き出しの操作は、子コンポーネントの更新を検知して行う。

つまり、子コンポーネントが頻繁に描画を更新する場合は、cacheAsBitmapを有効にすると
かえって遅くなります。
また、子コンポーネントで有効にするより、なるべく親コンポーネントで有効にするほうが
コンポーネントが多い場合にはパフォーマンスが向上します。

そして肝心なことなのですが、子コンポーネントを移動したり再描画する際には、
コンポーネントすべてを同一のタイミングで行うようにします。
これはひとつ子コンポーネントが更新されるたびに、キャッシュを1回づつ作成するのを
防ぐためです。

最後にもうひとつ。
ベクターグラフィックス(graphicsコンテキストにlineとかを描いたもの)を沢山
重ね合わせたコンポーネントがあると、その上に何かを重ね合わせたときに
パフォーマンスが著しく低下します。
これは子コンポーネント一つ一つの重ねあわせをやり直すからです。
これを防ぐには、ドラッグなどで動的な重ねあわせが発生している間だけ
cacheAsBitmapをtrueにします。
数千個ものコンポーネントがある場合に、特に有効なテクニックです。
さらに、子コンポーネントがマウスイベントに反応しないようにmouseEnabledを
切っておくとよいです。

これらのことをきちんとやりさえすれば、パフォーマンスはASでガチガチに最適化したものに
非常に近いものになります。
bitmapDataに直接ピクセル描画することでパフォーマンスを稼ぐテクニックは従来から
ありますが、アンチエイリアスやスケールを多用する場合は、むしろキャッシュの
使い方を最適化するほうがよいかもしれません。