2013-05-17 97 views
0

我正在將一個名爲Spiri的MC加載到一個名爲Box的MC中。後來我想從內存使用和屏幕外刪除。我在這裏沒有顯示補間的屏幕。as3 if remove Parent是否所有的孩子也被刪除?

如果我使用removeChild(box);它是否也會刪除所有的兒童? 基本上我從函數調用庫加載3電影。然後嘗試刪除它們並多次調用相同的函數。這意味着相同的電影一次又一次地加載相同的名稱。這是支持替換舊的,但也許它不是因爲我沒有正確刪除它們,因爲第10或第15次調用它變得非常緩慢。

我也在函數中添加了一個事件偵聽器。那麼是不是每次都添加一個事件 - Listner並佔用資源?

運行一個函數後,它似乎很慢,這讓我相信某些東西沒有正確卸載。

//I tried 
box.removeChild(Spiri); 
Spiri = null; 
//then remove the parent like this 
removeChild(box); /// but this gets an error. 
again if i just do this 
removeChild(Spiri); // it makes me wondering if they are getting removed. 

如何在mc中刪除父母和所有孩子的最佳方式是什麼?

+1

我建議你查看一下Adobe Scout我相信它現在仍然是免費的,並且是分析和調整性能的一個了不起的工具。它將監視計算機上的活動SWF文件,或者您可以將Scout安裝在移動設備和配置文件AIR應用程序(安裝非常簡單)上。 – shaunhusain

+0

@shaunhusain同意Adobe Scout。誠實地說,現在我無法想象沒有它的Flash開發。如此神奇的應用程序。 –

+0

還有一些好東西在這裏:http://active.tutsplus.com/tutorials/workflow/quick-tip-understanding-garbage-collection-in-as3/還有一件事要檢查是MrDoobs HiRes Stats https:///github.com/mrdoob/Hi-ReS-Stats – shaunhusain

回答

1

是和否。孩子們不再位於舞臺上,但直到removeChild()被調用,他們仍然是孩子的父母。這可能是好的,也可能是壞的。顯然,重用對象很好,但對於內存管理可能是可怕的,因爲這些對象只能在父對象被垃圾收集時進行垃圾回收。對於一個簡單的應用程序,通常很好。但是對於一些大規模的...並不是很重要。

對於我現在正在開發的項目(大量30頁,50,000個班輪),我創建了一個輕量級的GUI框架來處理所有的DisplayObject。除基本BitmapShapeDisplayObject之外的所有內容都擴展爲一個類,它延伸到Sprite。在這一類中,我有這樣的功能:

final public function destroy():void { 
    this.removeAllEventListeners(); 

    var i:int, l:int, cur:DisplayObject; 
    l = this.numChildren; 

    for (i = 0; i < l; i++) { 
     cur = this.getChildAt(i); 

     if (cur is XISprite && !this.stopChildXISpriteDestroy) { 
      (cur as XISprite).destroy(); 
     } 
     else if (cur is Sprite) { 
      (cur as Sprite).removeChildren(); 
     } 

     if (cur is Bitmap && (cur as Bitmap).bitmapData && !this.stopBitmapDestroy) { 
      (cur as Bitmap).bitmapData.dispose(); 
     } 

     if (cur is Loader && !this.stopLoaderDestroy) { 
      (cur as Loader).unload(); 
     } 

     if (cur is Shape) { 
      (cur as Shape).graphics.clear(); 
     } 
    } 

    cur = null; 
    i = l = NaN; 

    this.removeChildren(); 
} 

,它基本上是一個硬擦的所有對象,並讓我輕鬆晉級該類的所有兒童進行垃圾回收。我也跟蹤所有的事件監聽者,所以不會有任何流氓聽衆可以阻止GC(通過調用removeAllEventListeners())。我也有類中的一些受保護的標誌,允許你停止對某種對象類型的破壞(所以我可以在需要時將SWF或圖像加載到內存中)

這可能是矯枉過正,但內存消耗有在這個應用程序中一直存在問題,而且該功能確實有助於管理它。這可能比你需要的多,所以你可以用默認的參數調用removeChildren(),它會從父對象中移除所有的孩子。

作爲一種思想:保持DisplayObjectContainers儘可能簡單。儘可能避免嵌套它們。第一個有條件的地方,我稱之爲銷燬XISprite的子項的每個XISprite都是很好但是如果有負載和XISprite子項的負載,因爲destroy()調用會彼此堆積在一起,並且它可能是災難性的,凍結應用程序。

+0

真的很喜歡這個答案,我只做過bitmapData.dispose()調用。 graphics.clear()真的有幫助嗎?此外,只是供參考,但現在應該不成問題Loader.unload()的文檔說:在AIR 3.6之前,此方法對iOS沒有影響。 – shaunhusain

+0

@shaunhusain不知道它對iOS 3.6之前的版本沒有任何影響。過去幾周我只有3.6,所以我想我現在已經注意到了。 graphics.clear()轉儲所有的矢量數據。所以矢量本身被完全銷燬並從內存中移除。不能幫助實際對象的垃圾回收,但與矢量數據相比,該對象是微不足道的。 –

+0

很有意義感謝您的澄清 – shaunhusain