2011-08-14 2 views
1

メモリとガベージコレクションに関して、スプライト/ムービークリップから子供を削除する最も効果的な方法は何でしょうか?as3のDisplayObjectから子供を削除する最も効果的な方法は? (メモリ)

私は少なくとも3つの方法を見ました。

シンプル再assigment

sprite = new Sprite(); 

ヌルし、新しい

sprite = null 
sprite = new Sprite(); 

または私はちょうどきれいについて学んでいます(私は好きです)しばらく除去

while(sprite.numChildren > 0){ 
    sprite.removeChildAt(0); 
} 

良いメモリ管理、任意の有効な入力をいただければ幸いです、ありがとうございます。

答えて

5

のremoveChildまたはremoveChildAtは、実際にそれだけDISPLAYLISTから削除し、メモリからスプライトまたは他の任意のDisplayObjectを削除しません。つまり、1000のスプライトを作成してステージ(表示リスト)に追加した後、1000個のスプライトすべてに対してremoveChildを使用すると、メモリに永久に存在する可能性があります。

メモリから削除するには、すべての参照オブジェクトでnullに設定する必要があります。

あなたが本当にそれを削除したい場合は、ちょうどそれをゼロにし、これらの事を確認してください。

  • クリップに添付されているすべてのイベントリスナを削除するのremoveChildを使用してDISPLAYLISTからそれを削除またはremoveChildAt
  • 。オブジェクトを設定
  • あなたは配列内の参照を使用した場合、ベクトル、辞書または任意の他の目的は、Array.spliceを(使用して、NULLまたはスプライスに設定し、オブジェクトから削除)
  • =
ヌル

EventManagedSpriteのようなソリューションを使用してEventRemoverを使用すると、オブジェクトを完全に削除するのが少し楽になります。これは大きなプロジェクトでも役に立ちます。

スプライト/オブジェクトを再利用するが、リサイクルする場合は、オブジェクトプールを使用する必要があります。 object pooling with AS3の詳細:

+0

while(sprite.numChildren> 0){ var obj = sprite.getChildAt(0); sprite.removeChild(obj); obj = null; }これは安全な代替手段ですか? – SimpleRookie

+0

参照がnullに設定されても、表示リストからオブジェクトが削除されない場合、オブジェクトはガベージコレクトされますか? – Pup

+0

@Pupいいえ、それらはメモリに保持されます(これ以上リファレンスがなくなるまで)、ディスプレイ "list"も配列を使用していると仮定できます。 –

1

removeChild/removeChildAtは親からDisplayObjectを削除します。まだメモリに残っていますし、必要に応じて後で追加することもできます(参照している限り)。

私の経験では、DisplayObjectを削除してメモリに保存するには、removeChild + nullの割り当てが最適です。

乾杯、

関連する問題