Flash actionscript 3游戏性能 - 删除对象和重置属性

时间:2012-12-02 13:22:39

标签: performance actionscript-3 flash object cpu

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

我使用numchildren()来跟踪场景中有多少个对象,并且看起来某些实例没有被正确删除,因为跟踪的数量会增加并最终到达2000个对象附近......

我正在使用removeChild()删除对象,并试图弄清楚为什么这些对象仍在场景中。 我读到某个地方,如果没有正确重置,对象仍然可以使用cpu。

我仍然不熟悉使用Flash,我的主要问题是 - 如何找出哪些对象没有被删除,以及如何从游戏中完全删除它们?
除简单的removeChild()部分外,我还需要添加什么? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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;