2011-08-14 40 views
1

從內存和垃圾回收的角度來看,從精靈/動畫片段中移除子女的最有效方法是什麼?用於從as3中的DisplayObject中刪除兒童的最有效方法? (內存)

我見過至少三種方式。

簡單的重新分配新建分配FY

sprite = new Sprite(); 

空,然後新

sprite = null 
sprite = new Sprite(); 

或同時切除(這是我很喜歡的)

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

我剛學有關乾淨和良好的內存管理,任何VALID輸入將不勝感激,謝謝。

回答

5

removeChild之或removeChildAt實際上不從存儲器中刪除Sprite或任何其他的DisplayObject,它只能從顯示列表中刪除。這意味着如果您創建1000個精靈並將它們添加到舞臺(displaylist),然後在所有1000個精靈上使用removeChild,它們可能永遠存在於內存中。

要從內存中刪除它,它應該在所有引用對象中設置爲null。

如果你真的想刪除它,只是空,並檢查這些東西:

  • 使用removeChild之或removeChildAt
  • 卸下連接到片段中的所有事件偵聽器的顯示列表中刪除。
  • 如果使用在數組的引用,向量,字典或任何其他對象,從對象中刪除它,將其設置爲空或使用拼接它方法Array.splice()
  • 設置對象= NULL

您可以使用類似EventManagedSprite的解決方案,該解決方案使用EventRemover以使其完全移除對象更容易一些。這也可能有助於更大的項目。

如果您想要重新使用sprite/object,但想要回收您想要回收的對象,則應該使用對象池。更多關於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不,他們會保存在內存中(直到沒有引用了),你可以假設顯示「列表」也使用數組。 –

1

removeChild/removeChildAt將DisplayObject從其父項中移除;它仍然保留在內存中,你可以稍後添加它(如果你想要的話)(只要你有一個引用它)。

根據我的經驗,removeChild + null賦值是移除DisplayObject並保存在內存中的最佳方法。

乾杯,