Gå til innhold

Hvordan finne ut FPS'en i et OpenGL program?


Anbefalte innlegg

Hei!

 

Er det noen som vet hvordan jeg kan finne ut hvor mye FPS jeg har i et OpenGL program (C++)?

Jeg prøver nemlig å gjøre programmet mitt framerate-independent (aner ikke hvordan jeg skal oversette det til norsk). Jeg har søkt litt rundt på internett, men finner ingen ting. Noen som kan hjelpe meg litt med dette?

 

Takker får svar! :)

 

Miromurr

Lenke til kommentar
Videoannonse
Annonse

For å gjøre et program framerate independent pleier jeg å bruke High resolution timer (QueryPerformanceCounter og QueryPerformanceFrequency)

Og når en har tid siden forrige frame, er det en lett sak å regne ut hvor mange FPS det er (1/time) tar du et gjennomsnitt over flere målinger, så får du en mer riktig tid.

 

En multipliserer hver bevegelse med tid siden forrige frame for å få en frame independent bevegelse.

Lenke til kommentar

Jeg ser du har fått svar på det du lurer på og GeirGrusom bruker de samme funksjonen jeg ville brukt, men det virker på meg som du er litt på ville veier.

 

Det virker på meg som om du vil bruke resultatet fra fps utregningen til andre utregninger og det vil bli litt rart. Bruk heller resultatet fra funksjonene som GeirGrusom nevnte og hold FPS utenfor bildet.

 

Godt mulige jeg har tatt helt feil her, men jeg ville bare nevne det.

Lenke til kommentar

Nei, men jeg kan forklare kort hvordan den brukes.

 

class Timer
{
private:
 double m_freq;
 unsigned long long m_time;

public:

 Timer()
 {
unsigned long long lfreq;
QueryPerformanceFrequency((LARGE_INTEGER*)&freq);
m_freq = (double)freq;
m_time = 0;
 }

 double GetTimePassed()
 {
double ret = 0;
unsigned long long new_time;
QueryPeformanceCounter((LARGE_INTEGER*)&new_time);

if(m_time != 0)
  ret = (new_time - m_time) / m_freq;

m_time = new_time;

return ret;

 }
}

// OK dette er pseudo-kode, fordi jeg ikke gidder å gjøre det alt for omfattende
Timer my_timer = new Timer();
void my_main_function()
{
 double time_passed;
 double fps = 0;
 while(app_running)
 {
// Denne loopen er for hver frame
time_passed = my_timer.GetTimePassed();
fps = 1 / time_passed;
for each(unit in unit_collection)
{
  unit.position += unit.momentum * time_passed;
  unit.render();
}
 }
}

 

Koden for selve main loopen er langt ifra ideell, men bare for å vise hvordan high resolution timer fungerer.

 

Selv ville jeg lagt render funksjonen i en egen tråd.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...