Разработка игр: как ограничить FPS?

Я пишу игру, и я видел, что алгоритм FPS работает неправильно (когда ему приходится вычислять больше, он спит дольше...) Итак, вопрос очень прост: как рассчитать смазку для с правильным FPS?

Я знаю, сколько времени потребовалось, чтобы обновить игру за один кадр в микросекундах и, конечно же, FPS, который я хочу достичь.

Я ищу сумасшедшего для простого примера, но я не могу найти его...

Код может быть в Java, С++ или псевдо...

Ответ 1

Число микросекунд на кадр составляет 1000000 / frames_per_second. Если вы знаете, что вы потратили elapsed_microseconds расчет, то время, которое вам нужно спать:

(1000000 / frames_per_second) - elapsed_microseconds

Ответ 2

Время, затрачиваемое на рендеринг одного кадра, составляет 1/FPS секунд (если вы стремитесь, скажем, 10 FPS, вы должны потратить 1/10 = 0,1 секунды на каждый кадр). Поэтому, если для рендеринга потребовалось X секунд, вы должны "спать" за 1/FPS - X секунды.

Переведя это, например, в миллисекунды, вы получите

ms_to_sleep = 1000 / FPS - elapsed_ms;

Если это по какой-то причине занимает больше, чем 1/FPS для рендеринга фрейма, вы получите отрицательное время сна, и в этом случае вы, очевидно, просто пропустите спящий режим.

Ответ 3

Try...

static const int NUM_FPS_SAMPLES = 64;
float fpsSamples[NUM_FPS_SAMPLES]
int currentSample = 0;

float CalcFPS(int dt)
{
    fpsSamples[currentSample % NUM_FPS_SAMPLES] = 1.0f / dt;
    float fps = 0;
    for (int i = 0; i < NUM_FPS_SAMPLES; i++)
        fps += fpsSamples[i];
    fps /= NUM_FPS_SAMPLES;
    return fps;
}

... согласно http://www.gamedev.net/community/forums/topic.asp?topic_id=510019

Ответ 4

Посмотрите эту статью о различных методах обработки FPS.