Ich habe kürzlich diesen Artikel über Game Loops gelesen: http://www.koonsolo.com/news/dewitters-gameloop/
Und die empfohlene letzte Implementierung verwirrt mich zutiefst. Ich verstehe nicht, wie es funktioniert, und es sieht aus wie ein komplettes Durcheinander.
Ich verstehe das Prinzip: Aktualisiere das Spiel mit einer konstanten Geschwindigkeit, wobei alles, was übrig ist, das Spiel so oft wie möglich rendert.
Ich nehme an, Sie können nicht Folgendes verwenden:
- Holen Sie sich die Eingabe für 25 Ticks
- Render-Spiel für 975 Ticks
Annäherung, da Sie Input für den ersten Teil des zweiten bekommen würden und dies sich komisch anfühlen würde? Oder ist es das, was in dem Artikel vor sich geht?
Im Wesentlichen:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
Wie ist das überhaupt gültig?
Nehmen wir seine Werte an.
MAX_FRAMESKIP = 5
Nehmen wir an, next_game_tick, das unmittelbar nach der Initialisierung zugewiesen wurde, bevor die Hauptspielschleife "500" lautet.
Da ich für mein Spiel SDL und OpenGL verwende und OpenGL nur zum Rendern verwendet wird, nehmen wir an, dass GetTickCount()
die Zeit seit dem Aufruf von SDL_Init zurückgegeben wird, was auch der Fall ist.
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
Quelle: http://www.libsdl.org/docs/html/sdlgetticks.html
Der Autor geht auch davon aus:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
Wenn wir die while
Aussage erweitern, erhalten wir:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750, weil die Zeit seit next_game_tick
der Zuweisung vergangen ist . loops
ist Null, wie Sie im Artikel sehen können.
Also haben wir die while-Schleife betreten, machen wir eine Logik und akzeptieren eine Eingabe.
Blabla.
Am Ende der while-Schleife, an die ich Sie erinnern möchte, befindet sich in unserer Hauptspiel-Schleife Folgendes:
next_game_tick += SKIP_TICKS;
loops++;
Lassen Sie uns aktualisieren, wie die nächste Iteration des while-Codes aussieht
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000, weil die Zeit verstrichen ist, um Eingaben zu machen und Dinge zu erledigen, bevor wir die nächste Stufe der Schleife erreicht haben, in der GetTickCount () aufgerufen wird.
540, weil im Code 1000/25 = 40, also 500 + 40 = 540
1, weil unsere Schleife einmal durchlaufen wurde
5 , du weißt warum.
Also, da diese While-Schleife CLEARLY ABHÄNGIG ist MAX_FRAMESKIP
und nicht die beabsichtigte, TICKS_PER_SECOND = 25;
wie soll das Spiel überhaupt richtig laufen?
Es war keine Überraschung für mich, dass das Spiel, als ich dies in meinen Code implementierte, nichts unternahm, da ich einfach meine Funktionen umbenannte, um Benutzereingaben zu verarbeiten und das Spiel so zu zeichnen, wie es der Autor des Artikels in seinem Beispielcode hat .
Ich habe eine fprintf( stderr, "Test\n" );
while-Schleife eingefügt, die erst am Ende des Spiels gedruckt wird.
Wie läuft diese Spieleschleife garantiert 25 Mal pro Sekunde, während sie so schnell wie möglich gerendert wird?
Für mich sieht es aus wie ... nichts, es sei denn, mir fehlt etwas GROSSES.
Und ist das nicht eine Struktur dieser while-Schleife, die angeblich 25 Mal pro Sekunde abläuft und dann das Spiel genau so aktualisiert, wie ich es zu Beginn des Artikels erwähnt habe?
Wenn das der Fall ist, warum könnten wir dann nicht etwas Einfaches machen wie:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
Und rechne für die Interpolation auf eine andere Art und Weise.
Verzeihen Sie meine extrem lange Frage, aber dieser Artikel hat mir mehr geschadet als geholfen. Ich bin jetzt sehr verwirrt - und habe keine Ahnung, wie ich eine richtige Spieleschleife implementieren soll, weil all diese Fragen auftauchen.