Разработка игр: Как ограничить кадр/с?

Я пишу игру, и я видел, что алгоритм кадр/с не работает правильно (когда он должен вычислить больше, он спит дольше...) Так, вопрос очень прост: как вычислить sleeptime для того, чтобы иметь корректного кадр/с?

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

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

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

10
задан Martijn Courteaux 23 June 2010 в 15:07
поделиться

4 ответа

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

(1000000 / frames_per_second) - elapsed_microseconds
13
ответ дан 3 December 2019 в 15:05
поделиться

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

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

ms_to_sleep = 1000 / FPS - elapsed_ms;

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

14
ответ дан 3 December 2019 в 15:05
поделиться

Попробуйте ...

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

2
ответ дан 3 December 2019 в 15:05
поделиться

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

1
ответ дан 3 December 2019 в 15:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: