Wiedergabesystem: Eingaben oder Ereignisse aufzeichnen?

9

Ich habe folgendes gelesen: Wie man ein Wiedergabesystem entwirft Aber es beantwortet meine Frage nicht wirklich.

Mein Spiel wurde mit der Client "Ansicht" des Spiels als separates Programm vom Server "Modell" und "Controller" erstellt. (ein bisschen wie ein MMO oder ein Multiplayer-Spiel, das auf diese Weise gebaut wurde). Die Serverseite ist immer die "Wahrheit" des Spiels. Sie akzeptiert nur Aktionsanforderungen als Eingabe von den Clients und gibt Ereignisse und Nachrichten zum "aktuellen Status" aus.

Das Spielmodell und die Spielregeln sind vollständig deterministisch mit einem festen "Tick" -Updatezyklus, sodass ich auf der Serverseite sowohl die an die Clientansichten gesendeten Ereignisse als auch die Aktionsanforderungen aufzeichnen kann. Beide sind einer bestimmten Zyklusnummer zugeordnet.

Die Frage ist: In diesem Fall sollte ich zum Einrichten eines Wiedergabesystems die Eingabe oder Benutzeraktionsanforderungen (wie dort vorgeschlagen) oder die Ereignisse verwenden?

Es scheint mir, dass beide genau die gleiche Ausgabe geben würden. Die einzigen Unterschiede, die ich sehen kann, sind:

  • Ereignisse geben die tatsächliche Ausgabe aus, während Aktionsanforderungen verarbeitet werden müssen, um Ereignisse zu geben.
  • Bei Aktionsanforderungen sind möglicherweise weit weniger Daten aufzuzeichnen.

Gibt es noch andere Dinge zu beachten?

Klaim
quelle

Antworten:

5

Bei einem deterministischen System sind sie logisch äquivalent, sodass Ihre Zusammenfassung ziemlich korrekt ist. Es gibt jedoch noch zwei weitere Dinge, die mich dazu bewegen würden, Eingabeaktionen und keine Ausgabeereignisse aufzuzeichnen:

  1. Wenn Sie die Aktionen speichern, können Sie sie später als Testdaten verwenden, da sie mehr von Ihrem Code ausführen als nur die Wiedergabe von Ereignissen. Dies kann bei der Diagnose von Absturzfehlern, beim Auffinden von Verhaltensregressionen zwischen Builds usw. hilfreich sein.
  2. In Zukunft können Sie die Ereignisse ändern, die Sie für eine bestimmte Aktion senden, oder Sie können aus irgendeinem Grund verschiedene Ereignisse an verschiedene Clients senden. In diesem Fall kann die Wiedergabe ungültig oder unvollständig werden. Das gleiche Problem könnte theoretisch für Eingaben gelten, aber normalerweise ist der Bereich der Eingaben eingeschränkter als die Ausgaben und daher ist es weniger wahrscheinlich, dass er sich ändert, und es ist einfacher, ihn mit Abwärtskompatibilität zu berücksichtigen, wenn dies der Fall ist. (Eingaben beschränken sich auf das, was der Spieler und andere Eingabequellen (z. B. Zufallszahlengenerator) tun können, während die Ausgaben alle Ergebnisse dieser Eingaben sowie alle anderen Ausgaben enthalten, die durch die Spielregeln generiert werden, wie z. B. Präsentationshinweise, periodische Server- Nebenereignisse usw.)
Kylotan
quelle
Gute Punkte, insbesondere der erste. Ich habe diese Verwendung vergessen, aber sie ist sehr hilfreich.
Klaim
Bingo, besonders auf # 1. Wenn ich die Zeit hätte, ein Eingabeaufzeichnungssystem zu erstellen, könnte ich jeden einzelnen Test protokollieren und einige schwer zu reproduzierende Fehler erkennen. Wenn Sie diese "seltenen Fälle" erneut protokollieren können, können Sie den Fehler leichter erkennen, wenn Sie Ihren Code durchgehen.
ChrisC
1

Beides funktioniert, obwohl einige Dinge zu beachten sind.

Denken Sie zunächst daran, dass Sie Zeitinformationen aufzeichnen müssen. Bei Spielen mit jeder variablen Bildrate kann dies besonders schwierig sein. Sie müssen sicherstellen, dass Ihre Wiedergabedaten genau die gleichen Zeitinformationen liefern können, die das Spiel ursprünglich für die Simulation verwendet hat.

Sie müssen auch Änderungen am Spielverhalten berücksichtigen. Wenn Sie Eingaben aufzeichnen und dann einen Teil der Verarbeitung von Eingaben, der Auflösung der Physik usw. optimieren , wird Ihre Aufzeichnung ungültig. Selbst wenn Sie Spielereignisse aufzeichnen, bleiben Sie stecken, wenn sich ein Teil der Interpretation dieser Ereignisse ändert.

Wenn Sie nur Wiedergaben wünschen, ist es ein guter Ansatz, eine bestimmte Liste von Positionen und Rotationen für die Spielerentität zusammen mit Zeitinformationen aufzuzeichnen. Deaktivieren Sie so viel Physik und andere Spiellogik wie möglich, während Sie die Wiedergabe ausführen. Wie einfach oder machbar dies ist, hängt davon ab, wie viele andere Objekte Sie synchronisieren müssen.

Sean Middleditch
quelle
In der Frage stelle ich fest, dass das Spielmodell vollständig deterministisch ist. Es gibt keine Physik und Variationen der Bildrate sind nur auf der Clientseite sichtbar, nicht im Spielmodell, das vollständig vom "Tick" abhängig ist.
Klaim