hook — c ++ вычисляет FPS от перехвата функции, которая вызывается каждый кадр

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

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

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

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

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

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

0

Решение

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

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

Другие решения

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

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

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

  3. Рассчитайте следующее

    frames / time
    

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

1

Вы можете найти разницу во времени между суккуссивными кадрами. Обратное время даст вам частоту кадров. Вам необходимо реализовать функцию getTime_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;

}
1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector