Flash 使用和移除大量对象后,减速保持不变

Flash 使用和移除大量对象后,减速保持不变,flash,actionscript-3,flash-cs5,Flash,Actionscript 3,Flash Cs5,我被困在这件事上了。我正在做一个游戏。我使用这段代码创建了一些debree falling的令人眼花缭乱的场景。当一个物体被摧毁时,我会产生一些碎石,让它飞到屏幕上。但是当我经常使用它时,减速是存在的,即使所有的对象都消失了,减速仍然存在。好的旧的50fps不会再回来了:(这里有什么我错过的记忆吗?或者有更好的方法吗 public function destroyBlock(xPos,yPos,nrObjects) { for (var debree = 0; debree &

我被困在这件事上了。我正在做一个游戏。我使用这段代码创建了一些debree falling的令人眼花缭乱的场景。当一个物体被摧毁时,我会产生一些碎石,让它飞到屏幕上。但是当我经常使用它时,减速是存在的,即使所有的对象都消失了,减速仍然存在。好的旧的50fps不会再回来了:(这里有什么我错过的记忆吗?或者有更好的方法吗

public function destroyBlock(xPos,yPos,nrObjects) {

        for (var debree = 0; debree < nrObjects; debree++) {

            debreeObject = new mc_ground();
                debreeObject.x = xPos;
                debreeObject.y = yPos;
                debreeObject.scaleX = Math.random() * 0.3 + 0.1;
                debreeObject.scaleY = debreeObject.scaleX;
                debreeObject.speedX = Math.random()* 5 - 2.5;
                debreeObject.speedY = -Math.random() * 10 - 5;
            stageObject.addChild(debreeObject);

            debreeObject.addEventListener(Event.ENTER_FRAME, moveDebree);

        }

    }

    public function moveDebree(e:Event) {

        e.target.x += e.target.speedX;

        e.target.y += e.target.speedY;
        e.target.speedY += gravity;

        if (e.target.y > stageHeight) {

            e.target.removeEventListener(Event.ENTER_FRAME, moveDebree);
            e.target.parent.removeChild(e.target);
        }

    }
公共函数销毁块(XPO、YPO、nrObjects){
对于(var-debree=0;debreestageHeight){
e、 target.removeEventListener(Event.ENTER_FRAME,moveDebree);
e、 target.parent.removeChild(e.target);
}
}

我测试了你的代码,没有发现任何性能损失。你确定这不是游戏的另一部分造成的吗


我建议为这种类型的活动实现一个。因为创建
新的mc_ground()
对象会减慢速度,特别是在循环中。内存分配和释放可能会很慢;而通过垃圾收集,您可能会在任何给定的时间在内存中留下大量的东西

创建池后,您可以执行类似于
debreeObject=myDebreePool.getFromPool()
的操作,从池中获取一个对象。然后在对该对象调用
removeChild
后,使用类似于
myDebreePool.returnToPool(oldDebreeObject)
的操作将其返回到池中

根据您的需要,您可能需要对象池在返回对象时重置对象的状态。否则,它可能会记住不再需要的旧数据。但是,鉴于您的示例代码,我认为没有必要这样做


如果你正确地实现了你的对象池,你应该会在这种情况下看到显著的性能提升。

你是否验证过循环创建的相同数量的对象实际上通过
If(e.target.y>stageHeight){..}
?是的,我尝试了另一种方法,比如淡出对象的alpha值,然后使用
If(e.target.alpha==0)
用于删除对象。同样的事情。如果(e.target.y>stageHeight),请验证此IF语句我有一种感觉,你没有得到一个好的舞台高度谢谢很多人,这太奇怪了。我仍然有问题,所有的测试都表明问题在于此。我测试了不同的选项。可能不是一般的代码。当flash因屏幕上的许多对象而减速时,它会不会不再达到原来的速度对我来说这没问题,但这有点奇怪,不是吗?而且…当我做极端的事情时(使用此代码的数千个对象)然后转到debug->list objects,它向我显示了大约22670个对象。所以肯定还有一些东西。我会再测试一些。我修复了这个问题。我忘了将alpha改回y代码。上面的代码工作得很好,但是…如果我尝试
if(e.target.alpha==0)
它就没有了。我将它改为
if(e.target.alpha<0.1)
一切都很顺利。感谢大家的帮助和建议。谢谢,我将对此进行调查。