フラッシュは、メモリ使用量を減らすために、ステージ上にないピクセルを「隠す」ほどスマートですか? または、メモリ使用量がまったく減少する場合は、手動で行う必要がありますか?
3 に答える
Flash は、ステージ上にないオブジェクトをレンダリングしません ( http://help.adobe.com/en_US/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e3e.htmlに従って)。
ただし、2 つの異なる問題を混同している可能性があると思います。
問題の 1 つは CPU/GPU のパフォーマンスです。Flash はステージの境界外にある表示オブジェクトのレンダリングに時間を浪費しないため、ステージ外のオブジェクトについて心配する必要はありません。
もう 1 つの問題はメモリ使用量です。作成するすべてのオブジェクトは、画面に表示されるかどうかに関係なく、ある程度のメモリを消費します。Flash には未使用のオブジェクトを定期的に破棄するガベージ コレクターがありますが、「未使用のオブジェクト」とは他のオブジェクトから参照されていないオブジェクトを意味するため、メモリに問題がある場合は、イベント リスナーを削除してオブジェクトを手動でクリーンアップする必要があります。 null 参照など
メモリ使用量を減らすために利用できるようなものはありません。モニターに表示される場合は、Flash でレンダリングし、メモリ内にピクセルの色を保存する場所を用意する必要があります。
最近の Flash は非常に高速ですが、特にハードウェア アクセラレーションでは高速です。そのため、パフォーマンスについてあまり心配する必要はありません。AS3 を使用すると、仮想的な支出に見合うだけの価値があります。私はそれにすべての仮想ドルを賭けます。
Flash は、すべてのビットマップ、ムービークリップ、実際にはすべてのオブジェクトをメモリ内に保存します。ステージよりも大きい大きなビットマップがある場合、その一部のみを表示しているにもかかわらず、メモリを占有します。
ステージから移動する可能性のある複数のビットマップまたはムービークリップがあり、それらの一部が表示されない場合、メモリを回復する唯一の方法は、オブジェクトが逆参照され、null に設定されていることを確認することです。
myMovieClip = null;
null に設定する前に、オブジェクトを参照しているものがないことを確認する必要があります。たとえば、オブジェクトを配列に格納したり、イベント リスナーをアタッチしたりすることはできません。
myMovieClip.removeEventListener(Event.WHATEVER, eventHandler);
bitmapdata オブジェクトの場合、null に設定する前にまず dispose を呼び出す必要があります。
myBitmapdata.dispose();
myBitmapdata = null;
これにより、GC が選択したときにメモリを回復できるようになります。ただし、AIR を使用していない場合は、自分で gc 呼び出しを要求できます。
System.gc();
Flash Builder で開発している場合、ベスト プラクティスは、アプリケーションを定期的にプロファイリングし、ボタンをクリックして gc 呼び出しを強制することです。次に、どのオブジェクトがメモリに永続化されているかを確認し、メモリ リークの原因となっている参照を特定できます。