QueryPerformanceCounter Problem
-
Hallo liebe Com,
Ich habe volgendes Problem:
In einem kleinem "Spiel", dass ich entwicke habe ich einen "Bug" drinnen...
Also:
Das "Spiel" zoomt bei erstmaligem w,a,s oder d drücken einmal mit einem großem ruck, und danach wie es soll.
Das problem habe ich schon entziffert.. unzwar hat es mit dem counter zu tun .. aber ich verstehe das problem nicht ganz..
Hier ein Codeschnipsel:if( GetAsyncKeyState(VK_W )){ QueryPerformanceCounter((LARGE_INTEGER*) &timenow ); timepassed = timenow - timeold; fTransZ -= cos(fRotateY * fPi180) / 1000 * 0.5f * timepassed; fTransX -= sin(fRotateY * fPi180 ) / 1000 * 0.5f* timepassed; } [code] timeold wird in einer früheren funktion gesetzt. Alle time..-variablen sind von anfang an erstmals auf 0 gesetzt. Aber wenn ich das Timepassed weg lasse, funktioniert alles so wie es soll, ohne anfangsruckler: [code="cpp"] if( GetAsyncKeyState(VK_W )){ QueryPerformanceCounter((LARGE_INTEGER*) &timenow ); timepassed = timenow - timeold; fTransZ -= cos(fRotateY * fPi180) / 1000 * 0.5f; fTransX -= sin(fRotateY * fPi180 ) / 1000 * 0.5f; }
Wo liegt das problem ?
-
Wenn du die absolute Zeit messen willst, solltest du wohl besser GetTickCount() verwenden. QueryPerformanceCounter() ist für das Messen längerer Zeitperioden nicht unbedingt geeignet. Nachdem alle Werte mit 0 initialisiert sind, ist doch klar, dass es am Anfang springen wird, oder was genau glaubst du, dass QueryPerformanceCounter() dir zurückgibt!? Wo genau berücksichtigst du eigentlich die Frequenz des Performance Counters?
-
wie berücksichtige ich die ?
sehr lieb von dir dass du mir helfen magst
-
QueryPerformanceFrequency sagt dir, wie oft pro Sekunde der Counter hochzählt. Und QueryPerformanceCounter() fängt nicht für jeden Prozess bei 0 an. Du wirst deinen Startwert also entsprechend anders initialisieren müssen...
-
und wie verhindere ich damit das "jumpen" ?
-
Grund für das Jumpen ist: QueryPerformanceCounter() fängt nicht bei 0 an...
-
wo hast du Spieleprogrammierung gelernt?
-
und wie fängt der counter an ?
oder wie fixe ich das problem.?
@saffran ich bin es grade selbst ein wenig am lernen, aber spiele programmierung kann man das noch nicht wirklich nennen.. nennen wir es mal: Spielen mit den OpenGL funktionen und versuchen ein paar classen und structuren einzubinden
-
lilbeat schrieb:
und wie fängt der counter an ?
Na frag ihn das doch einfach...
-
Vermutlich musst Du selbst Dein Programm ja gar nicht starten und es läuft schon seit der Zeit "0". Falls Du es doch starten musst, würde ich vorschlagen, dass Du einfach den Computer fragst....
-
wie meinst du das ^^ ?
ich verstehe nicht ganz ..
-
Jochen Kalmbach schrieb:
Vermutlich musst Du selbst Dein Programm ja gar nicht starten und es läuft schon seit der Zeit "0". Falls Du es doch starten musst, würde ich vorschlagen, dass Du einfach den Computer fragst....
wie kann ich ihn denn fragen ?
-
QueryPerformanceCount()!?
-
Jochen Kalmbach schrieb:
QueryPerformanceCount()!?
das mache ich ja, in einer funktion, die direkt vor dieser ausgeführt wird
-
Freund der Blasmusik.
Du sollst deine timeold Variable bei Programminitialisierung mit QueryPerformanceCouner() setzen - ist das so schwer zu verstehen?
-
und wie meint ihr das mit der frequenz ?
-
Wie meint wer was mit der Frequenz?
Lies es in der MSDN nach, ist gut dokumentiert und wirklich nicht so schwer zu verstehen.