Попытка ограничить частоту кадров моей Flash-игры - PullRequest
0 голосов
/ 07 ноября 2010

У меня есть Flash-игра, которую я сделал еще в 2008 году. В наши дни она работает очень быстро.Слишком быстро на самом деле.У меня установлено значение 60fps в FlashDevelop, но я думаю, что это просто ограничивает количество вызовов отрисовки.Я думаю, что моя логика работает намного дольше 60 раз в секунду в эти дни.Я давно не делал ActionScript, но заметил, что использую enterFrameHandler, который выполняет мой логический цикл.Кажется, на это не накладывают никаких ограничений.Это просто уходит, как это называется, я верю.Есть ли способ, которым я могу ограничить его на 30 или 60 кадров в секунду?Я был бы очень признателен за любую помощь или идеи.Моя игра разрушается, если логика работает слишком быстро: (

ОБНОВЛЕНИЕ Поскольку некоторые знания ActionScript возвращаются ко мне, я просто что-то подумал. Разве enterFrameHandler не привязан к тому, что fpsустановлен в Flash или FlashDevelop в свойствах проекта? Кто-нибудь может подтвердить это? Это будет означать, что мои вызовы отрисовки и логические вызовы имеют значение 1: 1, верно?

1 Ответ

2 голосов
/ 07 ноября 2010

Действительно, обработчики enterFrame вызываются только при рендеринге кадра (при частоте 60 Гц в вашем случае).

Если вы можете ограничить количество раз, когда что-то выполняется, измеряя время. Примерно так:

// 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, попытка установить требуемый FPS на 60 ничего не даст; это, вероятно, просто приведет к удалению некоторых кадров. Это может быть хорошим способом проверить, вызывается ли ваш обработчик enterFrame где-то еще.

...