Разработка игр: как ограничить FPS? - PullRequest
10 голосов
/ 23 июня 2010

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 23 июня 2010

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

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

ms_to_sleep = 1000 / FPS - elapsed_ms;

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

13 голосов
/ 23 июня 2010

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

(1000000 / frames_per_second) - elapsed_microseconds
2 голосов
/ 23 июня 2010

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

1 голос
/ 04 июля 2010

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

...