Zeitabhängige Bewegung (mit QueryPerformanceCounter)??????
-
Die Zeit sollte nur einmal pro Frame abgefragt werden:
Time= gettime(); while{running} { oldtime= Time; Time= gettime(); frametime= Time - oldtime; //der Rest }Sonst misst du ja gar nicht alles.
Bye, TGGC
-
Ja, sorry, meinte auch end-start. Aber das Problem ist, glaube ich, dass
die LARGE_INTEGER Variablen frame_start und frame_end immer 0 sind, obwohl
QueryPerformanceBlabla(&frame_start und &frame_end) aufgerufen wird.Oder sie sind halt sehr sehr klein, dass auf Null gerundet wird, aber das kann
ja eigentlich nicht sein, oder?
-
wenn die LARGE_INTEGER variablen immer 0 sind, dann würde das evtl. bedeuten, dass deine hw über keinen high resolution performance counter verfügt...
ich machs in etwa so:
double frametime = (double) (frame_end - frame_start) / (double) freq;freq kannst du aber auch vorberechnen und nicht immer mit QueryPerformanceFrequency() abfragen und in double casten, da sich die wohl eher nicht ändern wird.
btw: da kommt die zeit in sekunden raus...
-
Dein Code mißt nur das Bewegen des Objekts, das viel langsamere BitBlt wird nicht beachtet. TGGC hat ja schon geschrieben wie es geht.
-
Erstmal Danke an euch alle!
you have to use 2 api calls :
when you initialize your program,
you call
QueryPerformanceCounter(LARGE_INTEGER *frequency).
LARGE_INTEGER is defined in windows.h and is a 64bits integer.
This will give the frequency of your computer counter in ticks/seconds
Now, before you start to draw you call
QueryPerformanceCounter(LARGE_INTEGER* count).
This will give you the count at wich the processor is.
Just before you flush everything to drawing, you call QueryPerformanceCounter again and you'll have time it took to draw the scene in seconds like this :
frametime = (count2 / frequency) - (count1 / frequency)
the fps is 1/frametime.
you write the time to your screen, and there you go!
You can make a nice class "counter" to hide those ugly calls and LARGE_INTEGER.
in the constructor you just call the query the frequency. Don't keep frequency it is not usefull, keep 1/frequency(and mutilply by your count value when you want to know the time, division are so slow compared to multiplication, but you should know that !)
Quelle:OpenGL.org Board
Danach bin ich gegangen, mal vom Fehler in Zeile 4 abgesehen.
Euren Antworten nach, ist der PerformanceCounter die beste oder einzige
Möglichkeit, die Zeit in einem Programm zu berechnen, oder gibts noch bessere?
-
0x00000001 schrieb:
Dein Code mißt nur das Bewegen des Objekts, das viel langsamere BitBlt wird nicht beachtet. TGGC hat ja schon geschrieben wie es geht.
ja, hab nicht genau genug gelesen wo er seine ticks misst...
ich mess natürlich auch die zeitdifferenz seit dem letzten frame.
btw, bei seinem code mit QueryPerformance*() kommen dann sekunden raus.
-
achja, das hab ich mal vor längerer zeit gefunden, is evtl. interessant:
-
Fehlalarm
-
Ich habe das Problem FPS-anhängig gelöst.
Das heißt, alles was sich irgendwie bewegt oder so, bekommt einen Multiplikator. Dieser Multiplikator wird berechnet durch DefaultFrames (mit so vielen Frames ist die Geschwindigkeit so, wie du es haben willst) geteilt durch aktuelle Frames.multiplier = defaultFPS / currentFPS
Also Beispiel:
Dein Spiel läuft bei 100fps so wie du es gerne hättest von der Geschwindigkeit.
multiplier = 100 / 85 (aktuelle FPS, Beispiel)
= 1.176~
Dann hat jede Bewegung 117%ige Geschwindigkeit.Btw: mit FPS meine ich jetzt einen Schleifendurchlauf der Mainloop
xindon
-
Das machen wir doch schon, die Frage ist, warum die Zeit falsch gemessen ist. Wenn der Schleifendurchlauf 0s dauert, hast du oo FPS, das hilft nichts viel weiter...
Bye, TGGC