Using “cacheAsBitmap” property at device font
個人的には「cacheAsBitmap」はFlash8の最重要機能のひとつで、色々と使い方試してるんだけど、なんだかこのプロパティは色々とトリッキーです。使い方誤ると高速化どころかメモリ一杯一杯で固まったりするし。中でも一番トリッキーなのが、デバイスフォントを含めるMCをCABったとき。あ、CABるというのは造語です。cacheAsBitmapね。長いからね。
「CAB使うとこれまで超重だった大量のテキストMCなんかもスムーズにスクロールできるんか!」と喜び勇んで実際CABってみると、デバイスフォント部分だけ真っ白に化けちゃって、「ああっ!デバイスフォントは駄目なんか!」という壁にぶち当たります。英語人はアウトラインフォント使ったら良いだけですが、日本人はそうはいきません。「ああ、結局、日本人はCABったらあかんのか・・・」と諦めてらっしゃった諸兄は、下記の回避策により無事CABれることでしょう。
以下、要点。
・デバイスフォントを含んだMCを正常にCABるには、onLoad時にステージの領域内に存在させて「実際に描画」したものをCABらないといけない。いきなり画面外に存在させると、実際の描画は起こらず、デバイスフォント部分だけCABられない。これが「真っ白化け」の理由。これを回避するには、一度画面内に置いてしっかりCABらせてから、その1フレーム後に画面外に飛ばす、という2ステップに分けて描画する小細工が必要。
・この、一時的に画面内に置いてるとき、そのMCを隠したいからといって、_visible=falseにしたらアカン。そしたらそれ描画されてないから。隠したいときは、上のレイヤーに背景色の矩形とか置いて隠す。Flashは背後のオブジェクトとはちゃんと描画してるので、この場合はちゃんとCABられる。
・CAB=trueにしたまま、そのMCに再描画がかかるようなアクション(例えばデバイスフォントでテキスト入力状態にしたり)をすると、全体的にトリッキーな描画バグを起こす。MCによって再描画がかかったり、かからなかったりして、全体的に滲んだような状態になったり、と、かなりアーティスティックな状態に陥る。発生状況はまちまちで完全に把握できていない。とりあえず、やばそうな動作(=CABに再描画がかかりそうな操作)をするときは、一度そのMCのCAB=falseにして、操作後またtrueに戻す、という感じにしておくと、バグは消える、あるいは、発生確率が減る。
・総じてこのへんのバグを隠蔽するためには、「Flashっていつどこに再描画かけてるのん?」という観点でデバッガの「再描画領域を表示」をONにしつつ、心の眼でFlashPlayerと対話する必要がある。
・それでも駄目で、もうもはや心の眼は通じません!ということなら、いっそCABはあきらめて、手動でBitmapオブジェクトにコピーして、再描画かけるタイミングをスクリプトでコントロールしてしまうほうが実は楽かも。
この土日、このへんとずっと格闘して、さっきとりあえず克服した記念にメモ。
かなり不毛な格闘だったけど、おかげでスクロールが当社200%程度に。かなり高速化されました。
これから思う存分、CABり尽くしてやります。
勉強になりましたー
ありがとうございます(^^)