9 Stimmen

Der beste Ansatz für Spieleanimation?

Ich habe eine Kursübung in OpenGL, um ein Spiel mit einfachen Animationen von ein paar Objekten zu schreiben

Während der Diskussion mit meinem Partner über unsere Designoptionen haben wir festgestellt, dass wir zwei Hauptoptionen für die Animation haben, entweder

  • Stellen Sie einen Timer für ein konstantes Intervall ein, z. B. 30 ms, und berechnen Sie, wo sich die Objekte befinden sollen, wenn der Timer läuft, und zeichnen Sie den Rahmen. oder -
  • Verwenden Sie keinen Timer, sondern eine normale Schleife, die die ganze Zeit läuft und in jeder Iteration prüft, wie viel Zeit vergangen ist, berechnet, wo sich die Objekte entsprechend dem Intervall befinden sollten, und zeichnet den Rahmen.

Welcher Ansatz sollte generell bevorzugt werden? Hat jemand konkrete Erfahrungen mit einem der beiden Ansätze?

10voto

Macke Punkte 23640

Rendern und berechnen Sie so schnell wie möglich, um die maximale Bildrate zu erreichen (die durch die vertikale Synchronisation begrenzt wird).

Verwenden Sie keinen Timer, sie sind nicht zuverlässig < 50-100 ms unter Windows. Prüfen Sie, wie viel Zeit vergangen ist. (Normalerweise benötigen Sie sowohl Delta t als auch einen absoluten Wert, je nachdem, ob Ihre Animation auf Physik oder Keyframe basiert).

Wenn Sie stabil sein wollen, können Sie auch eine obere/untere Grenze für Ihren Zeitschritt festlegen, um in Zeitlupe zu gehen, wenn ein Bild einige Sekunden zum Rendern braucht (Festplattenzugriff durch einen anderen Prozess?) oder eine Aktualisierung zu überspringen, wenn Sie zwei davon innerhalb von 10 ms erhalten.

Update (Da dies eine sehr beliebte Antwort ist)

Ich bevorzuge in der Regel einen festen Zeitschritt, da er alles stabiler macht. Die meisten Physik-Engines sind ziemlich robust gegenüber Zeitschwankungen, aber andere Dinge, wie Partikelsysteme oder verschiedene einfachere Animationen oder sogar Spiellogik, sind leichter abzustimmen, wenn man alles in einem festen Zeitschritt laufen lässt.

Aktualisierung2 (Da ich 10 Upvotes bekommen habe ;)

Um die Stabilität über lange Zeiträume (>4 Stunden) zu gewährleisten, sollten Sie sicherstellen, dass Sie keine Fließkommazahlen/Doppelzahlen zur Berechnung großer Zeitdifferenzen verwenden, da Sie dabei an Präzision verlieren und die Animationen/Physik Ihres Spiels darunter leiden werden. Verwenden Sie stattdessen Festkommazahlen (oder 64-Bit-Mikrosekunden-basierte) Ganzzahlen.

Für die haarigen Details empfehle ich die Lektüre Eine Frage der Präzision von Tom Forsyth.

4voto

Splo Punkte 9654

Lesen Sie diese Seite über Spielschleifen.

Kurz gesagt, stellen Sie einen Timer ein:

  • Aktualisieren Sie den Zustand des Spiels in einem fest Frequenz (etwa alle 25 ms = 1s/40fps). Dazu gehören die Eigenschaften der Spielobjekte, die Eingabe, die Physik, die KI usw. Ich nenne das die Modell und die Controller . Die Notwendigkeit einer festen Aktualisierungsrate ergibt sich aus den Problemen, die bei zu langsamer oder zu schneller Hardware auftreten können (lesen Sie den Artikel). Einige Physik-Engine bevorzugen auch mit einer festen Frequenz zu aktualisieren.

  • Aktualisieren Sie den Rahmen (die Grafik) des Spiels so schnell wie möglich . Das wäre die Siehe . Auf diese Weise werden Sie ein reibungsloses Spiel bieten. Sie können auch vsync aktivieren, damit der Bildschirm auf die Grafikkarte wartet (normalerweise sind es 60 fps).

Bei jeder Iteration der Schleife prüfen Sie also, ob Sie das Modell/den Controller aktualisieren sollten. Wenn es zu spät ist, aktualisieren Sie, bis sie auf dem neuesten Stand sind. Dann aktualisieren Sie den Rahmen einmal und setzen die Schleife fort.

Die Schwierigkeit dabei ist, dass aufgrund der unterschiedlichen Aktualisierungsraten bei schneller Hardware die Ansicht mehrmals vor dem Modell und dem Controller aktualisiert wird. Daher sollten Sie die Position Ihrer Spielobjekte in Abhängigkeit davon interpolieren, "wo sie sich befinden würden, wenn der Spielstatus aktualisiert worden wäre". Das ist wirklich nicht so schwierig.

Möglicherweise müssen Sie 2 verschiedene Datenstrukturen pflegen: eine für das Modell und eine für die Ansicht. Sie könnten zum Beispiel einen Szenengraph für Ihr Modell und einen BSP-Baum für Ihre Ansicht haben.

1voto

MandyK Punkte 1171

Die zweite Variante würde ich bevorzugen, da Timer oft nicht so genau sind, wie Sie wahrscheinlich denken, und die Latenz und der Overhead des Ereignisbehandlungssystems hinzukommen. Accounting für das Zeitintervall wird Ihre Animationen eine viel konsistente aussehen und robust sein, wenn / wenn Ihre Framerate Einbrüche.

Wenn Ihre Animation jedoch auf einer Physiksimulation basiert (z. B. Starrkörper- oder Ragdoll-Animation), kann ein festes Aktualisierungsintervall für die Physik die Implementierung erheblich vereinfachen.

1voto

dicroce Punkte 43066

Option 2 ist bei weitem vorzuziehen. Sie lässt sich gut auf unterschiedlich leistungsfähige Hardware skalieren.

Das Buch "Game Programming Gems 1" enthält ein Kapitel, das genau das abdeckt, was Sie brauchen:

Frame Rate Independent Linear Interpolation

0voto

Kevin Sheffield Punkte 3638

Verwenden Sie die zweite Methode. Hat ein Spiel für meine Senior-Projekt und aus Erfahrung, gibt es keine Garantie, dass Ihre Logik getan werden Verarbeitung, wenn der Timer will Feuer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X