使用和删除大量物体后,减速停留

时间:2011-07-19 14:14:34

标签: flash actionscript-3 flash-cs5

我坚持这个。我正在做一个游戏。我使用这段代码来创建一些关于debree下降的眼睛。当一个物体被摧毁时,我会产生一些碎石,让它飞过屏幕。但是......当我经常使用它时,减速就在那里,即使所有的物体都消失了,减速仍然存在。好的旧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);
        }

    }

2 个答案:

答案 0 :(得分:1)

我测试了你的代码,我看不出任何性能损失。你确定这不是游戏的另一部分吗?

Your code only on wonderfl

答案 1 :(得分:0)

我建议为此类活动实施Object Pool。因为创建new mc_ground()对象会减慢速度,特别是在循环中。内存分配和释放可能很慢;并且使用垃圾收集,你可能会在任何给定的时间内在内存中结束很多事情。

创建池后,您可以执行类似debreeObject = myDebreePool.getFromPool()的操作,它将从池中为您提供一个对象。然后在该对象上调用removeChild后,使用myDebreePool.returnToPool(oldDebreeObject)之类的内容将其返回到池中。

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

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