0

我正在将一个名为 Spiri 的 mc 加载到一个名为 Box 的 mc 中。后来我想从内存使用和屏幕外删除。我在此处未显示补间中的屏幕外。

如果我使用removeChild(box);它是否还会删除所有带有 in 的孩子? 基本上我正在使用函数调用从库中加载 3 部电影。然后尝试删除它们并多次调用相同的函数。这意味着相同的电影以相同的名称一次又一次地加载。这应该替换旧的,但可能不是因为我没有正确删除它们,因为到第 10 次或第 15 次调用它变得非常慢。

我也在一个函数中添加了一个事件监听器。那是不是每次都添加一些事件列表器并占用资源?

几次运行该功能后似乎很慢,这让我相信某些东西没有正确卸载。

//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 中删除父母和所有孩子的最佳方法是什么?

4

1 回答 1

1

是和不是。孩子们不再位于舞台上,但他们仍然是父母的孩子,直到removeChild()被调用。这可能是好是坏。显然,它非常适合重用对象,但对于内存管理可能很糟糕,因为这些对象只能在其父对象被垃圾回收时才能被垃圾回收。对于一个简单的应用程序,这通常很好。但是对于一些巨大的东西......不是那么多。

对于我现在正在处理的项目(30 页,50,000 行),我创建了一个轻量级的 GUI 框架来处理我的所有 DisplayObjects。除了 basicBitmapShape DisplayObjects 之外的所有东西都扩展了一个扩展的类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 上调用 destroy很好,但如果有负载和负载的 XISprite 孩子可能是灾难性的,因为 destroy() 调用会相互堆积并冻结应用程序。

于 2013-05-17T23:14:48.197 回答