是和否。孩子們不再位於舞臺上,但直到removeChild()
被調用,他們仍然是孩子的父母。這可能是好的,也可能是壞的。顯然,重用對象很好,但對於內存管理可能是可怕的,因爲這些對象只能在父對象被垃圾收集時進行垃圾回收。對於一個簡單的應用程序,通常很好。但是對於一些大規模的...並不是很重要。
對於我現在正在開發的項目(大量30頁,50,000個班輪),我創建了一個輕量級的GUI框架來處理所有的DisplayObject。除基本Bitmap
和Shape
DisplayObject
之外的所有內容都擴展爲一個類,它延伸到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()調用會彼此堆積在一起,並且它可能是災難性的,凍結應用程序。
我建議你查看一下Adobe Scout我相信它現在仍然是免費的,並且是分析和調整性能的一個了不起的工具。它將監視計算機上的活動SWF文件,或者您可以將Scout安裝在移動設備和配置文件AIR應用程序(安裝非常簡單)上。 – shaunhusain
@shaunhusain同意Adobe Scout。誠實地說,現在我無法想象沒有它的Flash開發。如此神奇的應用程序。 –
還有一些好東西在這裏:http://active.tutsplus.com/tutorials/workflow/quick-tip-understanding-garbage-collection-in-as3/還有一件事要檢查是MrDoobs HiRes Stats https:///github.com/mrdoob/Hi-ReS-Stats – shaunhusain