2010年12月26日日曜日

Graphicsのクリア忘れに注意

業務でやってたシステムで発生した問題。Flexで独自コンポーネントを作ったときに、updateDisplayListでGraphicsオブジェクト捕まえて、beginホゲホゲなどdrawホゲホゲなどやるのはよくあることだと思う。

その時に気を付けないといけないのが、Graphics.clear()の呼び忘れ。特に透明なしのベタ塗りだと、見た目は全く一緒なので、全く気づかないと思う。

では何が起こるかというと、描画コストがupdateDisplayList毎に増えていく。特にBitmapData.drawをするとよくわかる。簡単に言うと、ベタ塗り100回clearせずに行えば、BitmapData.drawを呼び出したときに、BitmapDataに100書き込まれるわけだ。

Flexでアニメーションを行おうとすると、領域が大きく、また子要素も多いと、フレームレートが低くなりがちである。その際に役に立つのが対象のオブジェクトを一旦BitmapDataに書きこんで、Bitmapをアニメーションさせるのである。フェードでも役に立つ。

開発しているシステムでは、これが徐々に遅くなり、イベントからアニメーション開始まで200msくらいフリーズした状態となっていた。しかも、連続運用4時間くらいから傾向が出始め、プロファイラで見てもメモリは増えてない。見つけるまで一週間かかった。みんなも気をつけましょう。。。

0 件のコメント:

コメントを投稿