0

我正在开发一个 Flash 游戏,它要求我在运行时将一个类中的对象实例化到场景中,并通过代码删除这些对象。这工作正常,我可以从游戏中动态添加和删除实例,但是大约两分钟后它开始极度滞后,最终会一起崩溃。

我曾经numchildren()跟踪场景中有多少对象,但似乎有些实例没有被正确删除,因为跟踪的数量会增加并最终达到接近 2000 个对象......

removeChild()用来删除对象并试图弄清楚为什么这些对象仍在场景中。我在某处读到,如果对象没有正确重置,它们可能仍会使用 cpu。

我对使用 flash 工作还是很陌生,我的主要问题是 - 我如何找出哪些对象没有被删除以及如何将它们完全从游戏中删除? 除了简单的部分
,我还需要在代码中添加什么? 任何帮助将不胜感激。removeChild()

4

1 回答 1

0

请提供使用 removeChild() 方法的代码部分。

通常你应该这样使用 removeChild() :

import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.TimerEvent;

var movieClip:MovieClip;
var timer:Timer=new Timer(5000, 1);
timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);

makeMovieClips();

function makeMovieClips() {
    for (var i:int; i<2000; i++) {
        movieClip=new MovieClip();
        movieClip.graphics.beginFill(Math.random()*0xFFFFFF);
        movieClip.graphics.drawCircle(Math.random()*stage.stageWidth, Math.random()*stage.stageHeight, Math.random()*40);
        movieClip.graphics.endFill();
        addChild(movieClip);
    }
    trace (numChildren) // should output 2000;
    timer.start();
}

function onTimerComplete(e:TimerEvent):void {
    while (numChildren>0) {
        movieClip=getChildAt(0) as MovieClip;
        removeChild(movieClip);
        // or we can use removeChildAt(0); instead of 2 lines above
    }
    trace (numChildren) // should output 0, because all objects are removed from display list;
}

另外请注意,如果在这些对象上留下任何引用,则从显示列表中删除对象不会将它们从内存中排除。在我的示例中,在所有 Movieclip 都从舞台上移除后,对一个 MovieClip 对象的引用仍然存在,因此它将占用 VM 内存的一部分,并且垃圾收集器不会清理该部分。在我的示例中,要删除引用,我应该在 onTimerComplete 方法的 while 循环之后添加这行代码:

movieClip=null;
于 2012-12-02T13:43:52.483 回答