Как сделать базовый счетчик 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