XNA Game Loop Update und Draw

7

Ich bin verwirrt darüber, wie und wann die Methoden des Spiels aufgerufen werden.

Also habe ich gelesen, dass die Sequenz ist:

  1. Initialisieren
  2. LoadContent
  3. Aktualisieren
  4. Zeichnen
  5. Inhalt entladen

Wo 3 und 4 sind die Spielschleife, so dass nach Updategenannt wird, Drawaufgerufen wird, dann Update, dann Draw, und so weiter. Die Spielschleife (Update and Draw) wird 60 Mal pro Sekunde ausgeführt.

Dann habe ich an einer anderen Stelle gelesen, dass Updateund Drawkann zu verschiedenen Zeiten aufgerufen werden und Updatekann mehr als einmal vorher aufgerufen werden Drawund so weiter.

... und wird am Ende UnloadContentnach dem Aufruf Updateder ExitMethode aufgerufen.

xdevel2000
quelle
Bei den 60 Bildern pro Sekunde wird davon ausgegangen, dass isFixedTimeStep auf true gesetzt ist, was standardmäßig der Fall ist. Sie können den Wert auf false setzen, wenn Sie die höchste Leistung Ihres PCs erzielen möchten, oder für das allgemeine Benchmarking.
ChrisC

Antworten:

11

Es gibt zwei Möglichkeiten, wie XNA die Spielschleife ausführen kann: Fixed Step und Variable Step. Wenn Sie Ihr Spiel so einrichten, dass Fixed Step ausgeführt wird, wird die Update-Methode basierend auf der angestrebten Spielzeit konsistent aufgerufen. Unabhängig davon, wie schnell Ihr Computer ist, ruft er die Update-Methode immer im gleichen Zeitintervall auf, sodass Update und Draw wie beschrieben nacheinander aufgerufen werden. Wenn Ihr Spiel jedoch langsam läuft, ruft XNA die Update-Methode mehrmals vor der Draw-Methode auf, um "aufzuholen".

Variable Step hingegen versucht nicht, vor dem Aufruf der Draw-Methode "Schritt zu halten" oder mehrere Update-Methodenaufrufe durchzuführen, wenn das Spiel langsam läuft.

BEARBEITEN: Netter Formularbeitrag, der Fixed Step und Variable Step erklärt, ist viel tiefer. gamedev.net

Cooper
quelle
6
Ich fand die beste Erklärung, wie es (für mich) funktioniert, hier: GameTime verstehen - Shawn Hargreaves Blog
Richard Marskell - Drackir
Danke, aber ich verstehe noch nicht, ob die Zeit 16 Millis beträgt. zwischen jedem Aufruf ist für die gesamte Spielschleife oder für das Update und dann für die Draw-Methode.
xdevel2000
@ xdevel2000, die Spielschleife ist nur die Update- und Draw-Methode. Sie können jedoch auch andere Methoden innerhalb der Update- und Draw-Methoden aufrufen, die alle Teil der Spielschleife werden.
Cooper
@Neeko, ja aber du beantwortest meine Frage nicht! Bitte, ich frage Sie, ob 16 Millis. sind für jede Methode oder für alle Spielschleifen (Update und Draw). Vielen Dank.
xdevel2000
@ xdevel2000 Entschuldigung, dass ich dies über ein Jahr später beantworte, aber ich habe diese Frage gerade bemerkt! Die 16ms sind für einen gesamten, einzelnen Spielschleifenzyklus. Nicht für jede innerhalb dieses Zyklus aufgerufene Methode.
Cooper
0

Machen Sie sich keine Sorgen über UnloadContent, es sei denn, Sie schreiben ein Spiel für Windows und laden nicht verwaltete Inhalte. Wenn Sie nur mit SpriteBatch zeichnen und möglicherweise SoundEffect- und Song-Objekte abspielen, vergessen Sie zunächst UnloadContent ().

Wenn Sie beim Aktualisieren und Zeichnen mit XNA beginnen, denken Sie daran, dass das XNA Framework automatisch Update, dann Zeichnen, dann Aktualisieren, dann Zeichnen ... usw. aufruft. Gibt es Ausnahmen? Ja. Müssen Sie sich um sie kümmern, wenn Sie anfangen? Nein, es sei denn, Sie sind bereits ein erfahrener Spieleentwickler. Wenn ja, nimm meine Entschuldigung an ...

Wenn Ihr Spiel einen festen Zeitschritt verwendet, wird dies verzögert, sodass diese Schleife nicht schneller als der Zeitschritt verläuft. Windows Phone-Projekte fügen eine Codezeile hinzu, um das Spiel auf 30 fps zu korrigieren. Sie werden ein wenig darüber lernen, indem Sie nichts weiter tun, als ein brandneues Windows Game-Projekt und dann ein brandneues Windows Phone Game-Projekt zu erstellen. Suchen Sie im Windows Phone-Projekt nach der einen Codezeile, die den Zeitschritt festlegt.

Der Kommentar oben zum Blick auf Shawn Hargreaves Beitrag ist genau richtig. Tatsächlich ist er DIE Quelle, wenn Sie offen über das XNA-Framework sprechen möchten. Es sind ein paar Jahre Posts, aber das ist eine gute Ressource.

Chris Gomez
quelle
1
Um UnloadContent ein wenig zu erweitern, gilt dies für den Standard-ContentManager, den das Game-Objekt bereitstellt. Sie können neue ContentManager erstellen, um verschiedene Inhalte in Ihren Spielen selbst zu laden und zu verwalten. In diesem Fall ist dies jedoch nicht erforderlich. Der Standard-ContentManager wird beim Beenden des Spiels entsorgt, wodurch der Inhalt automatisch entladen wird.
ChrisC
-2

Ich kenne keine Möglichkeit, die Reihenfolge zu ändern, aber Update und Draw sind nur Funktionen, mit denen Sie sie von anderen Orten aus aufrufen können - obwohl ich mir keine Verwendung vorstellen kann. In der Regel verwenden Sie einfach Update, Draw, Update, Draw usw., wie Sie gesagt haben.

Das Entladen wird aufgerufen, nachdem die Exit-Funktion Ja aufgerufen wurde.

T. Kiley
quelle