Wie soll ich eine Hauptspielschleife schreiben? [geschlossen]

130

Wie soll ich eine Hauptspielschleife schreiben? Was sind einige Dinge, die Sie in der Spieleschleife tun sollten, und was sind einige Dinge, die Sie in der Spieleschleife nicht tun sollten?

Ich habe viele von ihnen geschrieben, aber nie wirklich über Spielschleifen nachgelesen. Ich bin sicher, dass ich sie erheblich verbessern könnte, aber ich bin mir nicht sicher, wie.

hokiecsgrad
quelle
4
Böse Antwort: Was ist mit der Verwendung einer Engine, um diese Schleife für Sie zu erstellen? :)
user712092
Sie können den Benutzer nach der Gesamtzahl der Frames fragen, die er ausführen möchte, und eine for-Schleife bis zum n-fachen der Pufferanzahl verwenden.
Uğur Gümüşhan

Antworten:

121

Die Hauptspielschleife erledigt drei Hauptaufgaben:

  1. Benutzereingaben abrufen
  2. Aktualisiere den Spielstatus
  3. Zeichne das Spiel

In einer einfachen Spieleschleife werden diese drei Aufgaben zu einer while-Schleife zusammengefasst. Dies hat einige unerwünschte Ergebnisse:

  1. Das Spiel läuft mit unterschiedlichen Geschwindigkeiten auf verschiedenen Computern.
  2. CPU (kann unnötig sein) bei 100% Auslastung gekoppelt.
  3. "Spielzustände" / Menüs fehlen oder sind mit dem Spielcode gemischt.
  4. Die Hauptspielrunde ist sehr lang und schwer zu pflegen.
  5. Code kann nur schwer auf andere Plattformen übertragen werden.

Fortgeschrittene Spielschleifen lösen die oben aufgeführten Probleme. Hier sind einige nützliche Artikel:

Schauen Sie sich das Allegro-Skater-Demospiel an, um ein exzellentes Beispiel für eine Spielrunde zu erhalten:

  • Der Code für die Spielschleife befindet sich in framework.c .
  • Durchsuchen Sie den vollständigen Quellcode hier .

Game-Loops erledigen für die meisten Spiele oft die gleiche Arbeit, daher habe ich mir überlegt, wie man ein verallgemeinertes Game-Framework erstellen kann. Es ist besser, eine Implementierung einer Spieleschleife zu schreiben und zwischen den Spielen zu teilen. Es spart Arbeit beim Erstellen eines neuen Spiels und Verbesserungen an der freigegebenen Spieleschleife können von allen Spielen gemeinsam genutzt werden (z. B. Hinzufügen eines FPS-Zählers oder einer Bildschirmaufnahmefunktion).

Leftium
quelle
1
Ja, wie vermutet, kann ich definitiv Verbesserungen vornehmen. Gut liest. Vielen Dank auch für die Veröffentlichung des Codes. Es ist großartig, den tatsächlichen Spielcode mit diesem Zeug zu sehen.
Hokiecsgrad
1
Die CPU sollte zu 100% ausgelastet sein (oder zu 50%, wenn Sie mindestens 2 Kerne haben). Denk darüber nach. Wie können Sie Spitzenphysik und atemberaubende Grafiken erreichen, wenn Sie da hinten sitzen und sich sagen: "Oh, aber ich möchte nicht die gesamte CPU nutzen." Ja, Sie sollten nach Möglichkeit 100% der CPU verwenden (dies bedeutet jedoch Multithreading auf heutigen Computern, sodass es sehr schwierig ist, 100% der 4 Kerne gleichzeitig zu verwenden). Holen Sie das Beste aus Ihrem Computer heraus, auf dem Sie arbeiten können.
Bobobobo
5
Gestatten Sie mir, Folgendes anzufügen: Für Desktop-Programme . Auf einem tragbaren Gerät wird viel mehr Akku verbraucht, sodass Sie sich Gedanken über die 100% ige Nutzung machen müssen.
Bobobobo
1
@ user6003859: Ich habe den Link repariert.
Leftium
1
Ein weiterer nützlicher Link: gameprogrammingpatterns.com/game-loop.html
brita_
51

Ich würde Glenn Fiedlers Artikel über die Unabhängigkeit von robusten Frameraten empfehlen: " Fix Your Timestep! "

(Weniger relevant für das jeweilige Thema, aber die anderen Artikel in der Reihe sind auch ziemlich gut - genau wie alles auf seiner Seite!)

Neverender
quelle
Das sind definitiv einige wirklich gute Artikel. Danke fürs Schreiben!
Hokiecsgrad
1
Ich unterstütze die Empfehlung für eine robuste, von der Framerate unabhängige Implementierung. Alles in Ihrem Spiel sollte als Delta-Wert implementiert werden, den Sie regelmäßig aktualisieren. Und das sollte nicht unbedingt zur selben Zeit geschehen, in der Sie zum nächsten Frame übergehen. Wenn Sie einen Frame übersprungen haben, möchten Sie Ihre Aktualisierungsmethoden wahrscheinlich nicht einfach mit einem 2x-Delta aufrufen. Es wäre konsistenter, Ihr Update zweimal mit demselben Delta aufzurufen. Nehmen Sie sich auf jeden Fall die Zeit, um die Probleme mit Ihrer Bildrate und Ihrem Aktualisierungszyklus zu lernen. Sie sparen später Zeit.
Dennis Munsie