C ++ - SDL: проблема с ограничением частоты кадров

Хотя следующий код обеспечивает некоторую экономию энергии, FPS не ограничен должным образом. Когда предполагается зафиксировать частоту кадров на уровне 60 кадров в секунду, я получаю 82. То же самое для 30, я получаю 49 кадров в секунду.

Расчет FPS:

previousTime = currentTime;
currentTime = SDL_GetTicks();
fps_++;

if (currentTime - lastOutput >= 1000)
{
    lastOutput = currentTime;
    fps = fps_; // the variable 'fps' is displayed 
    fps_ = 0;
}

Ограничение FPS:

if (currentTime - previousTime < 1000 / maxFPS)
{
    SDL_Delay(1000 / maxFPS - currentTime + previousTime);
}

Что я напортачил?


person Aaron    schedule 05.07.2012    source источник
comment
какой тип maxFPS? int (что подразумевает ошибки целочисленного деления и округления) или float? Кстати, лучшее вычисление fps не будет зависеть от того факта, что между двумя выходами прошла одна секунда, используйте разницу между currentTime и lastOutput для повышения точности.   -  person Zeograd    schedule 05.07.2012
comment
Плавать. Я не совсем понял, что вы сказали о вычислении FPS.   -  person Aaron    schedule 05.07.2012
comment
Вам следует попробовать шагать по 1 мс за раз. Это даст вам лучшую точность. Обратите внимание, что вы никогда не получите точно 60 кадров в секунду, потому что время в этом случае просто неточно.   -  person imallett    schedule 06.07.2012


Ответы (3)


Я определенно не эксперт, но вы можете попробовать это!

SDL_Delay(1000 / maxFPS - SDL_GetTicks() + previousTime);

Использование вновь рассчитанного текущего времени может помочь

person Jacob Jensen    schedule 08.07.2012

Когда вы создаете такой рендерер:

SDL_Renderer * renderPtr = SDL_CreateRenderer (windowPtr, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

ФЛАГ SDL_RENDERER_PRESENTVSYNC будет соответствовать функции текущего состояния вашей частоте обновления монитора.

Надеюсь, это поможет !! Причинил мне много головной боли !!!

Вот ссылка: https://wiki.libsdl.org/SDL_CreateRenderer

person HgMerk    schedule 25.03.2015

Вероятно, это вызвано тем фактом, что SDL_Delay сообщает операционной системе выключить выполняемый вами процесс. В зависимости от того, какая у вас ОС, это, вероятно, в некотором смысле приведет к разному поведению. SDL_Delay обычно не означает, что выполнение гарантированно продолжается ровно через указанное количество миллисекунд. Некоторые говорят, что это гарантирует, что придется ждать, по крайней мере, столько же, чтобы переключить процесс обратно, но я не смог найти этому доказательств. Я думаю, это больше похоже на рекомендацию ОС, но, в конце концов, ОС сама решит (в зависимости от ОС).

Однако для Windows степень детализации переключения контекста может быть изменена, что дает вам больше шансов контролировать это: функция timeBeginPeriod

Вы, вероятно, больше не задумываетесь об этом, но, возможно, ответ может помочь кому-то другому ...

person Martin G    schedule 05.05.2014