Я пишу игру, и я видел, что алгоритм кадр/с не работает правильно (когда он должен вычислить больше, он спит дольше...) Так, вопрос очень прост: как вычислить sleeptime для того, чтобы иметь корректного кадр/с?
Я знаю, сколько времени это взяло для обновления игры один кадр в микросекундах и конечно кадр/с, которого я хочу достигнуть.
Я ищу сумасшедший простой пример, но я не могу найти тот....
Код может быть в Java, C++ или псевдо....
Количество микросекунд в кадре равно 1000000 / frames_per_second
. Если вы знаете, что потратили на вычисления elapsed_microseconds
, то время, которое вам нужно для сна, равно:
(1000000 / frames_per_second) - elapsed_microseconds
Время, которое вы должны потратить на рендеринг одного кадра, составляет 1/FPS
секунд (если вы стремитесь, скажем, к 10 FPS, вы должны потратить 1/10 = 0,1 секунды на каждый кадр). Таким образом, если на рендеринг ушло X
секунд, вы должны "спать" в течение 1/FPS - X
секунд.
Переведя это, например, в миллисекунды, вы получите
ms_to_sleep = 1000 / FPS - elapsed_ms;
Если по какой-то причине на рендеринг кадра ушло больше, чем 1/FPS
, вы получите отрицательное время сна, и в этом случае вы, очевидно, просто пропустите сон.
Попробуйте ...
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
Посмотрите эту статью о различных методах обработки FPS.