Как сделать базовый счетчик FPS?
Я пытаюсь отобразить мои кадры в секунду в моей программе рендеринга Куба. Я хотел бы увидеть его исполнение. Итак, как я могу это сделать? Я уже исследовал это, но примеры, которые я видел, используют несколько классов и все еще не работают, или они используют библиотеки, которых у меня нет. Есть ли способ получить FPS, используя предварительно установленные библиотеки, такие как ctime? Я использую OpenGL с C++.
вот моя функция (пустой):
void GetFPS()
{
}
и затем я показываю свой FPS в моя функция рендеринга с:
std::cout << xRot << " " << yRot << " " << zRot << " " << FPS << "n"; //xRot, yRot, and zRot are my cube's rotation.
моя программа установлена на 60FPS, но я хотел бы видеть фактический FPS, а не то, что он установлен.
2 ответов
вы должны попробовать 2 различных временных интервала, используя clock()
однако отмечает, что есть несколько проблем:
- разрешение часов составляет несколько миллисекунд (вы можете обойти использование std:: chrono и т. д., Однако даже chrono может иметь не такое высокое разрешение в зависимости от реализации. На моем ПК с GCC 4.9.1 я никогда не получаю лучшего разрешения, чем 16 миллисекунд даже с std::chrono.
- работникам, используя
clock()
вы получите 0 Сколько раз и в какой-то момент Вы будет измерять Реальное время (в моем случае это просто прыжок на 15/16 миллисекунд) - если вы не используете вертикальную синхронизацию (vsync), вы не будете измерять Реальное время кадра, а только время процессора, затраченное в цикле рендеринга (для активации vsync вы должны установить Swapinterval(1) с функцией ОС или, например, с помощью библиотеки, такой как SDL, которые обеспечивают портативную кросс-платформенную реализацию)
- для измерения реального времени рендеринга вы можете использовать запрос времени GL (у вас может быть только 1 таймер привязан в любое время, поэтому, если вы измеряете частоту кадров, вы не можете измерить, сколько времени занимает рендеринг).
- Не измеряйте FPS (ну, если вы не хотите просто показать его пользователям), вместо этого измерьте время кадра в миллисекундах, что дает гораздо более интуитивное приближение производительности. (вы знаете, что от 100 до 80 кадров в секунду разница 2,5 МС, от 40 до 20 кадров в секунду разница 25 мс!)
что делать:
double clockToMilliseconds(clock_t ticks){
// units/(units/time) => time (seconds) * 1000 = milliseconds
return (ticks/(double)CLOCKS_PER_SEC)*1000.0;
}
//...
clock_t deltaTime = 0;
unsigned int frames = 0;
double frameRate = 30;
double averageFrameTimeMilliseconds = 33.333;
while(rendering){
clock_t beginFrame = clock();
render();
clock_t endFrame = clock();
deltaTime += endFrame - beginFrame;
frames ++;
//if you really want FPS
if( clockToMilliseconds(deltaTime)>1000.0){ //every second
frameRate = (double)frames*0.5 + frameRate*0.5; //more stable
frames = 0;
deltaTime -= CLOCKS_PER_SEC;
averageFrameTimeMilliseconds = 1000.0/(frameRate==0?0.001:frameRate);
if(vsync)
std::cout<<"FrameTime was:"<<averageFrameTimeMilliseconds<<std::endl;
else
std::cout<<"CPU time was:"<<averageFrameTimeMilliseconds<<std::endl;
}
}
вышеуказанный код работает также, Когда вы делаете что-то, что занимает несколько секунд. Я делаю вычисление, которое обновляется каждую секунду, вы также можете обновлять его чаще. (обратите внимание, что я использую именно этот код в большинстве своих проектов, которым нужен FPS)
просто сохранить время "тики" до и после рендеринга сцены, а затем сделать простой расчет.
вот пример, который использует <ctime>
' s