2016-11-26 20 views
0

Хорошо, поэтому я делаю эту небольшую «программу» и хотел бы иметь возможность рассчитать FPS. У меня возникла идея, что если я подключу функцию, называемую каждым фреймом, я могу вычислить FPS?C++ вычислить FPS при подключении функции, которая называется каждым фреймом

Вот полный провал, теперь, когда я смотрю на него этот код снова я вижу, как глупо я был думать, что это будет работать:

int FPS = 0; 
void myHook() 
{ 
    if(FPS<60) FPS++; 
    else FPS = 0; 
} 

Очевидно, что это идиотская попытка, хотя и не знаю, почему я даже логично подумал, что это может сработать в первую очередь ...

Но да, возможно ли вычислить FPS путем подключения функции, которая называется каждым кадром?

Я сел и думал о возможных способах сделать это, но я просто ничего не мог придумать. Любая информация или что-то было бы полезно, спасибо за чтение :)

+4

Возможно, измерительное время может помочь? –

ответ

1

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

  1. Отслеживайте кадров приращением счетчик, каждый раз, когда выполняется перерисовка

  2. отслеживать, сколько времени прошло с момента последнего обновления (получить текущее время в вашей функции крюка)

  3. Вычислить следующую

    frames/time 
    

Использование высокого разрешения таймера. Используйте разумную скорость обновления (1/4 секунды или тому подобное).

1

Это должно сделать трюк:

int fps = 0; 
int lastKnownFps = 0; 

void myHook(){ //CALL THIS FUNCTION EVERY TIME A FRAME IS RENDERED 
    fps++; 
} 
void fpsUpdater(){ //CALL THIS FUNCTION EVERY SECOND 
    lastKnownFps = fps; 
    fps = 0; 
} 

int getFps(){ //CALL THIS FUNCTION TO GET FPS 
    return lastKnownFps; 
} 
1

Вы можете найти разницу во времени между succussive кадрами. Обратное к этому времени даст вам частоту кадров. Вам нужно реализовать функцию getTime_ms(), которая возвращает текущее время в ms.

unsigned int prevTime_ms = 0; 
unsigned char firstFrame = 1; 
int FPS     = 0; 

void myHook() 
{ 
    unsigned int timeDiff_ms = 0; 
    unsigned int currTime_ms = getTime_ms(); //Get the current time. 

    /* You need at least two frames to find the time difference. */ 
    if(0 == firstFrame) 
    { 
     //Find the time difference with respect to previous time. 
     if(currTime_ms >= prevTime_ms) 
     { 
      timeDiff_ms = currTime_ms-prevTime_ms; 
     } 
     else 
     { 
      /* Clock wraparound. */ 
      timeDiff_ms = ((unsigned int) -1) - prevTime_ms; 
      timeDiff_ms += (currTime_ms + 1); 
     } 

     //1 Frame:timeDiff_ms::FPS:1000ms. Find FPS. 
     if(0 < timeDiff_ms) //timeDiff_ms should never be zero. But additional check. 
      FPS = 1000/timeDiff_ms; 
    } 
    else 
    { 
     firstFrame = 0; 
    } 
    //Save current time for next calculation. 
    prevTime_ms = currTime_ms; 

}