Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MichaelB Mini JLI'ler
Anmeldedatum: 09.07.2005 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 30.07.2005, 11:19 Titel: Frage zu QueryPerformanceCounter |
|
|
Hallo,
nachdem mein erstes Pong (http://de.geocities.com/mymibran/Pong.zip) jetzt läuft, ist mir etwas aufgefallen:
Ich hab's exakt wie im JLI Buch implementiert, allerdings ist mir aufgefallen, daß das Programm dann etwa jede Sekunde (wenn CurCont - LastCount > Frequency) bei dieser Abfrage eine minimale Denkpause einlegt, die sich wie folgt äußert:
Die Animation friert für einen winzigen Sekundenbruchteil ein, um dann danach das verlorene Stück Weg durch kurzfristige Beschleunigung wieder einzuholen. Kein großer Effekt, aber wenn man ganz genau hinschaut, sieht man's: Jede Sekunde geht ein kleiner Ruck durch den Spielball...
Gruß,
Michael
Zuletzt bearbeitet von MichaelB am 30.07.2005, 12:08, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 30.07.2005, 11:42 Titel: |
|
|
Liegt mit ziemlich hoher Wahrscheinlichkeit nicht an dieser Funktion, zeig doch mal etwas Code. |
|
Nach oben |
|
 |
MichaelB Mini JLI'ler
Anmeldedatum: 09.07.2005 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 30.07.2005, 12:00 Titel: |
|
|
Code: | // Struktur, in der Informationen zur Nachricht gespeichert werden
MSG msg = {0};
// Diese Schleife läuft bis die Nachricht WM_QUIT empfangen wird
while(msg.message != WM_QUIT)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// Nachricht weiterleiten
TranslateMessage(&msg); // falls bestimmte Tastenmessage
DispatchMessage(&msg);
else
{
// Hole Tickerstand
QueryPerformanceCounter((LARGE_INTEGER*)&CurrentCount);
if ((CurrentCount - LastCount) > Frequency)
{
LastCount = CurrentCount;
Framerate = Frames;
Frames = 0;
}
// Tasten abfragen und Sprite entsprechend bewegen
if(GetAsyncKeyState(VK_UP) & 0x8000)
LeftRacket.MoveUp(30);
else if(GetAsyncKeyState(VK_DOWN) & 0x8000)
LeftRacket.MoveDown(30);
Frames++;
OpponentKI();
DrawScene();
}
}
|
|
|
Nach oben |
|
 |
GreveN JLI Master

Alter: 38 Anmeldedatum: 08.01.2004 Beiträge: 901 Wohnort: Sachsen - Dresden Medaillen: Keine
|
Verfasst am: 30.07.2005, 12:13 Titel: |
|
|
In dem oberen If-Block fehlt eine geschweifte Klammer.
Wie hoch ist im Moment deine Framerate? Bedenklich niedrig?
Kommentier doch mal systematisch alles aus, was nicht direkt mit der FPS-Berechnung zusammenhängt und schau, wo der Flaschenhals liegen könnte.
OpponentKI() und DrawScene() klingen verdächtig.
Inputhandling mittels GetAsyncKeyState() ist auch nicht wirklich effizient. |
|
Nach oben |
|
 |
MichaelB Mini JLI'ler
Anmeldedatum: 09.07.2005 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 30.07.2005, 14:55 Titel: |
|
|
GreveN hat Folgendes geschrieben: | In dem oberen If-Block fehlt eine geschweifte Klammer. |
Ups ja, hatte vor dem Reinkopieren noch einen (für den Thread unwichtigen) Programmteil unsauber entfernt.
Erstmal danke für die Antwort - verfolge derzeit ein paar weitere Beobachtungen. melde mich dann wieder; vielleicht sogar mit des Rätsels Lösung.
Gruß,
Michael |
|
Nach oben |
|
 |
MichaelB Mini JLI'ler
Anmeldedatum: 09.07.2005 Beiträge: 27
Medaillen: Keine
|
Verfasst am: 04.08.2005, 12:07 Titel: |
|
|
Ok, Ursache des Problems gefunden: Fenstermodus.
Wenn ich das FRAMETIMINGEX Beispiel aus dem Buch kompiliere (allerdings mit Windowed = TRUE), habe ich dasselbe abgehackte Animationsverhalten, das mich stört.
Um das zu verbessern, hatte ich zunächst noch den Ansatz verfolgt, bei jedem Aufruf von Draw() die Anzahl der vergangenen Ticks mitzugeben und sich daraus jeweils aktuell die zurückgelegten Pixel zu berechnen. Im Ergebnis hat sich das Geruckel zwar deutlich verbessert, ist aber nicht weg.
Schätze dafür bräuchte man Realtime-Multitasking.  |
|
Nach oben |
|
 |
|