0

我有一个 2008 年制作的 Flash 游戏。这些天它运行得非常快。实在是太快了。我在 FlashDevelop 中将其设置为 60fps,但我认为这只是限制了绘制调用的数量。我认为这些天我的逻辑每秒执行超过 60 次。我有一段时间没有使用 ActionScript,但我注意到我正在使用一个 enterFrameHandler 来执行我的逻辑循环。它似乎没有设置任何约束。我相信它只是被称为它。有什么办法可以将它限制在 30 或 60 fps?我将不胜感激任何帮助或想法。如果逻辑运行得太快,我的游戏就毁了:(

更新 当一些 ActionScript 知识回到我身边时,我只是想到了一些事情。enterFrameHandler 不是受项目属性下 Flash 或 FlashDevelop 中 fps 设置的约束吗?有人可以证实这一点吗?这意味着我的绘图调用和逻辑调用是 1:1 对吗?

4

1 回答 1

2

实际上, enterFrame 处理程序仅在渲染帧时才被调用(在您的情况下为 60Hz)。

如果您可以通过测量时间来限制执行某事的次数。像这样的东西:

// A property to store the last time the code was executed
protected var lastTimeCalled:int;

// Inside your enterFrame handler
protected function onEnterFrameHandler(e:Event): void {
    var ti:int = getTimer(); // Get current time
    var desiredFPS:Number = 60; // Actual framerate you want
    var frameInterval:Number = 1000 / desiredFPS; // Desired ms per frame

    if (isNaN(lastTimeCalled) || ti >= lastTimeCalled + frameInterval) {
        // Execute code here
        ...

        // Increase time (by chunks of fixed size for framerate self-adjustment)
        lastTimeCalled = isNaN(lastTimeCalled) ? ti : lastTimeCalled + frameInterval;
    }
}

但请注意,如果您的 SWF 帧速率设置为 60,尝试将 desiredFPS 设置为 60 将无济于事;它可能只会导致一些帧被丢弃。不过,这可能是测试您的 enterFrame 处理程序是否在其他地方被调用的好方法。

于 2010-11-07T17:38:27.700 回答