优化我的自制Flex游戏的最佳方式?

时间:2011-01-05 04:53:39

标签: flex optimization

我有一个关于在Flex中制作Flash游戏的问题。 现在我正在开发2D格斗游戏,这里是链接:http://xoz.netai.net/stickfightjx/StickFightJX.html

但是,我不确定我对主循环进行编程的效率如何。

由于我从未阅读过教程或看过任何其他Adobe Flex游戏,因此我不知道如何实现它们。我有一个Timer实例,每24帧调用一次更新函数,它会更新所有游戏对象和视图。

有没有办法让它更快?我在浪费任何东西吗?

// This is in an MXML Application

private var timer:Timer = new Timer(1 / 24);

private function onInitialize(e:Event):void
{
    timer.addEventListener(TimerEvent.TIMER, onUpdate);
    timer.start();
}

private function onUpdate(e:TimerEvent):void
{
    gameStateManager.update();
}

1 个答案:

答案 0 :(得分:1)

你所拥有的应该可以正常工作,但是在帧率低于你预期的慢速计算机上你可能会遇到麻烦。

对于流畅的动画,您需要收听ENTER_FRAME事件。您的update()方法应该将自上一帧以来的时间增量作为参数。您可以使用它来根据时间而不是帧外计算。

例如:

...
// Called from your original code.
private function update():void
{
    xPos += 10;
    yPos += 5;
}
...

在这种情况下,更新对象将使其xPos和yPos成员分别增加10和5,与调用TIMER事件一样频繁。在慢速计算机上,CPU将无法跟上,更新之间的时间会更长,并且会减慢整个游戏的速度,使战斗变得更加轻松。

更新也将与帧速率不同步,导致动画看起来不稳定。发生这种情况是因为有时在再次渲染画布之前会有多个更新,这意味着该对象将改为将该xPos和yPos更改为该帧的20和10。

...
// Called from ENTER_FRAME with the time since the last call passed in.
private function update(deltaT:Number):void
{
    xPos += 10 * deltaT;
    yPos += 5 * deltaT;
}
...

在这种情况下,更新对象将分别将其xPos和yPos成员每秒更改一次10和5(如果deltaT以秒为单位),无论CPU速度有多慢。由于您正在使用ENTER_FRAME事件,因此每次渲染画布时,更新也会发生一次且仅发生一次。