PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fps ermitteln


Ryu
29.07.2002, 08:43
hat jemand ne gute idee wie ich am besten die fps (frames per second) ermittlen könnte? also ich hab wohl eine möglichkeit gefunden aber ich glaube sie ist ungenau:

Uint32 lastframe, curframe, frametime;

lastframe = curframe;
curframe = SDL_GetTicks();
frametime = curframe - lastframe;

also das is jetzt mit sdl die varibablen oben werden gleich am anfang der main initialisiert, die drei zeilen unten kommen in die hauptschleife... also is der wert in frametime jetzt der wirkliche frames per SECOND wert oder is dieser wert in millisekunden, und muss dann umgerechnet werden (mal 216000 oder?)

also stimmt es so wie ich oben ingeschrieben habe oder gehjört das anders oder wisst ihr ne bessere methode??? :confused:

thx schonmal
:)


xOOn
29.07.2002, 10:29
mit SDL wird sich niemand auskennen :(

zumindest ich nicht

Ryu
29.07.2002, 10:38
hmm warum eigenbtlich nich. hmm, und kennt ihr ne methode bei directx?

Bibolorean
30.07.2002, 13:10
der Performace Counter ist ein Hardware Baustein, der mit 3,19 MHz läuft. Dies entspricht einer Genauigkeit von weniger als 1 Milisekunde!! *freude herrscht* ;)

Der Funktions-Aufbau:

BOOL QueryPerformanceFrequency(LARGE_INTEGER* lpFrequenzy);

der Rückgabewert ist NULL, wenn der Performace Counter nicht existiert (man beachte: NULL= False) und der übergebene Wert lpFrequenzy enthält dann die Frequenz, mit der der Counter läuft. LARGE_INTEGER (64Bit) enthält die Frequenz des Counters in Ticks per Second) diese Frequenz kann sich ohne neustart des PC's nicht ändern (kA ob's geht mit neustart ;))

Um den eigentlichen Wert des Counters zu erhalten, muss Mann die Funktion:
void QueryPerformaceCounter(LARGE_INTEGER* lpCount);
aufrufen (klar, Frau auch *gg*)


Noch zur Frage, wie man nun das ganze überhaupt brauchen kann (ist aber nen Frame Limiter):


#define FRAME_RATE 30

LONGLONG Frequenz;
LONGLONG Abstand;
LONGLONG NaechsteFrame;
LONGLONG AktuelleZeit;

//wenn der Counter vorhanden ist, Frequenz speichern
if(!QueryPerformanceFrequenzy((LARGE_INTEGER*)&Frequenz))
{
Error("Performace Counter nicht vorhanden"); // Das is ne "eigene" Funktion, im aufbau: void Error(char msg[]); und die coutet das ganze dann nur ;)
}

....


// Abstand zwischen 2 Frames berechnen
Abstand = Frequenzy / FRAME_RATE;

// aktuelle Zeit speichern
QueryPerformaceCounter((LARGE_INTEGER*)&AktuelleZeit);

// berechnen wann das nächste Frame gezeichnet werden soll
NaechsteFrame = AktuelleZeit + Abstand;

while(TRUE)
{
// testen, ob eine Nachricht vorliegt
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
break;
}
}
else
{
// aktuelle Zeit holen
QueryPerformaceCounter((LARGE_INTEGER*)&AktuelleZeit);

//Wenn es Zeit für das nächste Frame ist
if(AktuelleZeit > NaechsteFrame)
{
// verarbeite Ein- und Ausgaben
// und sonst alles ;)
NaechsteFrame = AktuelleZeit + Abstand;
}
}
}




naja, is nich gerade Frame anzahl berechnen, geht aber auch, musst es nur ein bissl umformen! :D
Ich hoff, habe nix mehr vergessen..

Greetz Bìbòlorean

PS: Falls Fragen auftauchen, einfach weiter fragen! ;) :)