Noch kürzer Warten als Sleep(1)
-
MSDN schrieb:
The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.
in alteZeit steht z.B. 120000, nach 10ms (einen Schleifen durchlauf) giebt GetTickCount() 120010 zurück für neueZeit, neueZeit - alteZeit macht somit 10ms.
Du kannst dazu auch den QueryPerformanceCounter verwenden, mußt es dir dann nur so umschreiben.
-
MiC++ha schrieb:
MSDN schrieb:
The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.
in alteZeit steht z.B. 120000, nach 10ms (einen Schleifen durchlauf) giebt GetTickCount() 120010 zurück für neueZeit, neueZeit - alteZeit macht somit 10ms.
Du kannst dazu auch den QueryPerformanceCounter verwenden, mußt es dir dann nur so umschreiben.Das ist leider nicht so. Denn nach 10ms ist noch kein Tick vergangen. Das heißt GetTickCount() ist immer noch 120000. Das ist ja mein Problem.
You typically use GetTickCount to compare the current Windows time with the time returned by the GetMessageTime function. GetMessageTime returns the Windows time when the specified message was created. GetTickCount is limited to the resolution of the system timer.
The system timer runs at approximately 10ms.
Windows Me/98/95: The system timer runs at approximately 55ms.
Windows NT 3.1: The system timer runs at approximately 16ms.
-
joomoo schrieb:
Keine genauere Lösung als Sleep wurde gepostet. Außer das mit dem QueryPerformanceCounter, aber das klappt bei mir nicht, denn es wartet plötzlich kürzer wenn man eine Taste gedrückt hält. Keine Ahnung warum.
Dann liegt das aber nicht daran, dass die Performace Counter falsch arbeiten, sondern dass dein Code falsch ist. Da die Performace Counter spezielle Hardware ist, kann es diesbezüglich auch keine Probleme geben. Ich hab mir vor geraumer Zeit mal 'ne Stoppuhr-Klasse geschrieben, und da hab ich auch die Performance Counter benutzt. Damit hatte ich sowhl auf meinem alten Rechner (AMD Thunderbird 900) sowie auf meinem aktuellen Rechner (AMD Athlon XP 2600) bisher keine Probleme. Wenn's dich interessiert, dann such mal hier im Forum nach chronometer, afair hab ich mal 'ne rudimentäre Version der Klasse gepostet.
-
@joomoo
Deine Aussage kann ich nicht bestätigen, wenn ich folgendes teste:switch (message) { case WM_KEYDOWN: DWORD idle,idle2; idle = GetTickCount(); Sleep(3); idle2 = GetTickCount(); char buffer[80]; sprintf(buffer,"start:%d / ende:%d ",idle,idle2); SetWindowText(hwnd,buffer); break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); }
in der WndProc, dann erhalte ich immer 2 unterschidliche Werte, wobei die differenz zwischen 3 und 8ms liegt, was beweist das Sleep ungenau ist, aber nicht das GetTickCount() mind. alle 10ms aktuallisiert wird, selbst mit sleep(1) war die differenz 2ms, nach deiner aussage müßten die werte aber gleich sein, das ist aber nicht so.
Daher reicht es für normale und die meißten Spiele das aus, was ich vorgab, bei mir klappt es ja auch.EDIT:
und auf 2-3ms kommt das auch nicht drauf an da man es nicht bemerkt, eine Sekunde hat 1000ms.
Wenn du wenig in der Spielschleife machst, so das sie, sagen wir mal 2ms nur benötigt, dann solltest du nur mit float werten arbeiten bei der Bewegung und testen ob >0.5 && <1, ne 1 wählen, etc.
-
Multimedia-Timer (z.B. timeGetTime() ) sollten nochmal genauer sein als z.B. GetTickCount()...
...aber normalerweise wird bei Spielen QueryPerformanceCounter() in Verbindung mit QueryPerformanceFrequency() verwendet und was genaueres liefert die WinAPI wohl auch nicht...
-
geeky schrieb:
Multimedia-Timer (z.B. timeGetTime() ) sollten nochmal genauer sein als z.B. GetTickCount()...
...aber normalerweise wird bei Spielen QueryPerformanceCounter() in Verbindung mit QueryPerformanceFrequency() verwendet und was genaueres liefert die WinAPI wohl auch nicht...Ganz genau so ist es, wie gesagt GetTickCount reicht schon für einige "einfache" Spiele, aber sonst sollte man das mit dem PerformanceCounter lösen, und das jetzt so umzusetzten dürfte bei allen Angaben hier jetzt wohl kein Problem mehr bilden.
-
Hmm, 10ms wären immer noch 100 fps (oder bin ich jetzt blöd ?) - Wieso reicht dir das eigentlich nich ?
-
erstmal @mic++ha
Probier mal das:
int x = 1;
DWORD y = GetTickCount();
while (x<10)
{
if (y != GetTickCount())
{
y = GetTickCount();
cout << y << endl;
++x;
}
}
cin >> x;
Da siehste dann das der Unterschied ca. 15ms ist. Zu mindestens bei mir. Es könnte ja auch sein dass das verschieden ist.dann noch @greeky
Stimmt. Aber bei meinem Spiel macht das trotzdem einen merkbaren Unterschied (Vielleicht liegt es ja auch an meinem Spiel). Ich glaube 15 ms machen schon einen Unterschied da du sie ja bei jedem Frame merkst. Aber ich habe immer noch das Problem, dass wenn ich eine Wartefunktion mit GetTickCount() mache, das ich dann ja 100% CPU-Auslastung habe... Wie ist das eigentlich bei dem QueryPerformanceCounter?
-
MiC++ha schrieb:
@joomoo
Deine Aussage kann ich nicht bestätigen, wenn ich folgendes teste:switch (message) { case WM_KEYDOWN: DWORD idle,idle2; idle = GetTickCount(); Sleep(3); idle2 = GetTickCount(); char buffer[80]; sprintf(buffer,"start:%d / ende:%d ",idle,idle2); SetWindowText(hwnd,buffer); break; case WM_DESTROY: PostQuitMessage (0); break; default: return DefWindowProc (hwnd, message, wParam, lParam); }
in der WndProc, dann erhalte ich immer 2 unterschidliche Werte, wobei die differenz zwischen 3 und 8ms liegt, was beweist das Sleep ungenau ist, aber nicht das GetTickCount() mind. alle 10ms aktuallisiert wird, selbst mit sleep(1) war die differenz 2ms, nach deiner aussage müßten die werte aber gleich sein, das ist aber nicht so.
Daher reicht es für normale und die meißten Spiele das aus, was ich vorgab, bei mir klappt es ja auch.EDIT:
und auf 2-3ms kommt das auch nicht drauf an da man es nicht bemerkt, eine Sekunde hat 1000ms.
Wenn du wenig in der Spielschleife machst, so das sie, sagen wir mal 2ms nur benötigt, dann solltest du nur mit float werten arbeiten bei der Bewegung und testen ob >0.5 && <1, ne 1 wählen, etc.Wenn ich deinen COde bei mir teste habe ich das 15 ms unterschied auch bei sleep(1).
-
joomoo schrieb:
Wenn ich deinen COde bei mir teste habe ich das 15 ms unterschied auch bei sleep(1).
Das sagt uns das dein Sleep absolut ungenau ist, das höchste in meinen Test war 11ms, das kleinste 1ms. durchschnitt 2-4ms. Aber es zeigt uns das die Werte nicht gleich sind, ich habe w98, so müßte ich ja Sleep(55) angeben damit die Werte unterschidlich sind, ich habe mal die Werte alle in einen Edit hinzu gesetzt und ne Taste gedrückt gehalten. Das Zeigt mir das GetTickCount() vollkommen ausreicht und vieleicht ne Tolleranz von 0.5ms hat.
Was der Text von MSDN bedeutet weiß ich nicht, da es nur ein Ausschnitt ist, gieb mal den Link und vieleicht kann ich das dann mal übersetzent Verdeutlichen.
-
MiC++ha schrieb:
joomoo schrieb:
Wenn ich deinen COde bei mir teste habe ich das 15 ms unterschied auch bei sleep(1).
Das sagt uns das dein Sleep absolut ungenau ist, das höchste in meinen Test war 11ms, das kleinste 1ms. durchschnitt 2-4ms. Aber es zeigt uns das die Werte nicht gleich sind, ich habe w98, so müßte ich ja Sleep(55) angeben damit die Werte unterschidlich sind, ich habe mal die Werte alle in einen Edit hinzu gesetzt und ne Taste gedrückt gehalten. Das Zeigt mir das GetTickCount() vollkommen ausreicht und vieleicht ne Tolleranz von 0.5ms hat.
Was der Text von MSDN bedeutet weiß ich nicht, da es nur ein Ausschnitt ist, gieb mal den Link und vieleicht kann ich das dann mal übersetzent Verdeutlichen.Wie ich schon gesagt habe ist es bei mir nicht so, aber ich habe jetzt einen ersatz mit dem queryperformancecounter gefunden (http://www.c-plusplus.net/forum/viewtopic.php?t=85587&postdays=0&postorder=asc&highlight=chronometer&start=10 Danke an groovemaster das du einfach deinen Code reinstellst!!! Ich hoffe ich kann mich irgentwann mal revangieren....) der auch die ms nach einer bestimmten zeit misst. Das sieht dann so aus:
void Schlafe(unsigned char was) { int x = cm.elapsed_milliseconds(); while (true) { if(cm.elapsed_milliseconds()-x >= was) return; } }
Ich hab jetzt nur noch das Problem das ich die ganze Zeit 100% CPULast habe. Wie kann ich das umgehen?
-
LOL?
Du zwingst einem **nicht-**Echtzeit-Betriebssystem eine Echtzeit-Bremse auf und erwartest nun auch noch, das Ganze CPU-schonend über die Bühne bringen zu können?
-
Hepi schrieb:
LOL?
Du zwingst einem **nicht-**Echtzeit-Betriebssystem eine Echtzeit-Bremse auf und erwartest nun auch noch, das Ganze CPU-schonend über die Bühne bringen zu können?
Eben sagt ihr mir noch ich soll diesen PerformanceCounter nehmen und jetzt meint ihr, dass ich dafür hinnehmen muss, die ganze Zeit 100% CPU-Auslastung zu haben? Das muss doch machbar sein!
-
Wo genau benutzt denn groovemasters Schlafe Funktion PerformanceCounter? Du schreibst doch selber, du hättest "...einen Ersatz für QueryPerformanceCounter gefunden..."!
Jau, einen CPU-fressenden Ersatz...
-
Hepi schrieb:
Wo genau benutzt denn groovemasters Schlafe Funktion PerformanceCounter? Du schreibst doch selber, dü "hättest einen Ersatz für QueryPerformanceCounter gefunden"...
Jau, einen CPU-fressenden Ersatz...
while(aktiv)
{
/* Spiel Code, zeichnen, Tastenüberprüfen, etc... */
Schlafe(70 - Zeit die der Spiel COde brauchte);
}
-
Öhm... Du weißt nicht wirklich, was Du da tust, oder? Ist nur 'ne Frage, Du mußt sie nicht beantworten...
-
Hepi schrieb:
Öhm... Du weißt nicht wirklich, was Du da tust, oder? Ist nur 'ne Frage, Du mußt sie nicht beantworten...
Komm auf den Punkt...
-
Hepi schrieb:
Wo genau benutzt denn groovemasters Schlafe Funktion PerformanceCounter? Du schreibst doch selber, du hättest "...einen Ersatz für QueryPerformanceCounter gefunden..."!
Jau, einen CPU-fressenden Ersatz...
Wo hab ich denn gesagt dass ich einen Ersatz habe? Find ich jetzt nicht. Brauchst mir nur sagen auf welcher Seite.
-
joomoo schrieb:
ich habe jetzt einen ersatz mit dem queryperformancecounter gefunden der auch die ms nach einer bestimmten zeit misst. Das sieht dann so aus:
void Schlafe(unsigned char was) { int x = cm.elapsed_milliseconds(); while (true) { if(cm.elapsed_milliseconds()-x >= was) return; } }
Ich seh da kein QueryPerformanceCounter?!?
-
Hepi schrieb:
joomoo schrieb:
ich habe jetzt einen ersatz mit dem queryperformancecounter gefunden der auch die ms nach einer bestimmten zeit misst. Das sieht dann so aus:
void Schlafe(unsigned char was) { int x = cm.elapsed_milliseconds(); while (true) { if(cm.elapsed_milliseconds()-x >= was) return; } }
Ich seh da kein QueryPerformanceCounter?!?
cm Ist eine Klasse mit dem QueryPerformanceCounter. Hab ich das nicht geschrieben? Schau hier: http://www.c-plusplus.net/forum/viewtopic.php?t=85587&postdays=0&postorder=asc&highlight=chronometer&start=10