我坚持这个。我正在做一个游戏。我使用这段代码来创建一些关于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);
}
}
答案 0 :(得分:1)
我测试了你的代码,我看不出任何性能损失。你确定这不是游戏的另一部分吗?
答案 1 :(得分:0)
我建议为此类活动实施Object Pool。因为创建new mc_ground()
对象会减慢速度,特别是在循环中。内存分配和释放可能很慢;并且使用垃圾收集,你可能会在任何给定的时间内在内存中结束很多事情。
创建池后,您可以执行类似debreeObject = myDebreePool.getFromPool()
的操作,它将从池中为您提供一个对象。然后在该对象上调用removeChild
后,使用myDebreePool.returnToPool(oldDebreeObject)
之类的内容将其返回到池中。
根据您的需要,您可能需要对象池在返回时重置对象的状态。否则,它可能会记住不再需要的旧数据。但是,根据您的示例代码,我认为没有必要。
如果您正确实现了对象池,那么在这种情况下您应该会看到显着的性能提升。