我正在开发一个Flash游戏,它要求我在运行时将类中的对象实例化到场景中,并通过代码删除这些对象。 这样可以正常工作,我可以动态地添加和删除游戏中的实例,但是在大约两分钟后,它开始非常滞后,最终会崩溃。
我使用numchildren()
来跟踪场景中有多少个对象,并且看起来某些实例没有被正确删除,因为跟踪的数量会增加并最终到达2000个对象附近......
我正在使用removeChild()
删除对象,并试图弄清楚为什么这些对象仍在场景中。
我读到某个地方,如果没有正确重置,对象仍然可以使用cpu。
我仍然不熟悉使用Flash,我的主要问题是 - 如何找出哪些对象没有被删除,以及如何从游戏中完全删除它们?
除简单的removeChild()
部分外,我还需要添加什么?
任何帮助将不胜感激。
答案 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;