Ответ 1
Число микросекунд на кадр составляет 1000000 / frames_per_second
. Если вы знаете, что вы потратили elapsed_microseconds
расчет, то время, которое вам нужно спать:
(1000000 / frames_per_second) - elapsed_microseconds
Я пишу игру, и я видел, что алгоритм FPS работает неправильно (когда ему приходится вычислять больше, он спит дольше...) Итак, вопрос очень прост: как рассчитать смазку для с правильным FPS?
Я знаю, сколько времени потребовалось, чтобы обновить игру за один кадр в микросекундах и, конечно же, FPS, который я хочу достичь.
Я ищу сумасшедшего для простого примера, но я не могу найти его...
Код может быть в Java, С++ или псевдо...
Число микросекунд на кадр составляет 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
для рендеринга фрейма, вы получите отрицательное время сна, и в этом случае вы, очевидно, просто пропустите спящий режим.
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
Посмотрите эту статью о различных методах обработки FPS.