Wie entwirft man ein Aufnahme- / Wiedergabesystem für ein häufig wechselndes Spiel?

10

Ich arbeite in einem kostenlosen MMORPG und habe ein Problem.

Ich entwickle (mit anderen Leuten) ein Videoaufzeichnungssystem für das Spiel. Die Idee ist im Grunde: Wir zeichnen alle gesendeten und empfangenen Pakete mit Zeitstempeln sowie einige lokale Daten vom Client auf und speichern sie dann in einer Datei. Zum Abspielen des Videos emulieren wir einfach alles, was in der Datei enthalten ist. Wir haben auch die Möglichkeit, das Video mit ffmpeg nach avi zu exportieren.

Das Problem ist: Wenn wir zwischen den Versionen des Spiels wechseln, ist es schwierig, die Abwärtskompatibilität für das Video aufrechtzuerhalten (Befehle hinzugefügt / entfernt, Funktionsänderungen usw.). Gibt es eine gute Möglichkeit, dieses Problem zu lösen? anstatt eine Reihe verschiedener Player zu haben und für jede Version der Videodatei den richtigen auszuwählen?

Es wäre hilfreich zu wissen, wie andere Spiele mit dieser Situation umgehen.

Danke für die Hilfe, sorry für mein Englisch.

Marco
quelle
Nur als weitere Nahrung zum Googeln / Nachforschen: So wie Sie es tun, haben die Quake Games von id Demos aufgezeichnet, indem Sie Server-Pakete erfasst haben. Soweit mir bekannt ist, haben sie die Kompatibilitätsprobleme einfach nie gelöst.
Michael Stum
Ich habe den Titel dieser Frage geändert - es geht nicht wirklich um MMOs, außer dass MMOs die am häufigsten wechselnden Spiele sind.

Antworten:

8

Unsere Grundregel lautet, niemals einen vorhandenen Pakettyp zu ändern. Alles wird entweder am Ende eines vorhandenen oder eines neuen Befehls hinzugefügt. Dies macht es auch weitaus unwahrscheinlicher, dass zwei Personen sich gegenseitig auf die Arbeit stampfen.

Codierer
quelle
In diesem Spiel passiert es .. Pakete werden hinzugefügt, entfernt, verschoben (zum Beispiel haben wir vor einiger Zeit beschlossen, alle GM-Commands-bezogenen Pakete in ein "erweitertes Paket" zu verschieben. Dies würde wahrscheinlich wieder passieren, wenn wir das umschreiben Gildensystem .. Das Bearbeiten von Befehlen / Funktionen (Ändern der Funktionalität) ist weniger wahrscheinlich, aber das ist nicht der Punkt. Sie sagen, dass wir von nun an kein Paket mehr entfernen sollten. Löschen Sie Befehle, damit sie nicht auf der Serverseite erreichbar sind. Danke für Ihre Antwort!
Marco
1
Ja, veraltet und lass sie dort. Irgendwann können alte Sachen entfernt werden, aber das ist normalerweise nach ein oder zwei Jahren.
Coderanger
1
Auch eine zusätzliche Planung würde helfen. Je besser Sie Ihre Pakete jetzt planen, desto weniger Änderungen müssen Sie in Zukunft vornehmen.
Kylotan
Das Problem ist, dass sich das Spiel ständig ändert. Wir fügen fast jeden Monat ein neues Paket hinzu (wir fügen neue Funktionen hinzu). Und dennoch müssen wir viele Änderungen an den Funktionen zum Umschreiben alter Pakete vornehmen und so weiter. Aber ich denke, wir können die Methoden dort belassen und ein Jahr warten, um sie zu entfernen.
Marco
3
Die Verwendung allgemeinerer Pakettypen würde Ihnen hier sehr helfen. Sie sollten nicht für jede neue Funktion, die Sie implementieren, neue Nachrichten hinzufügen müssen.
Kylotan
5

Insbesondere auf einem PC ist es nicht unvorstellbar, dass sie nur den Gameplay-Code versionieren und die Version anstoßen, wenn sie Änderungen vornehmen, die sich auf das Wiedergabesystem auswirken. Wenn die Wiedergabedatei mit der Version des Gameplay-Codes versehen ist, mit dem sie erstellt wurde, und der Client weiterhin Zugriff auf diese Version hat, sollte dies einwandfrei funktionieren.

U62
quelle
So habe ich das in der Praxis gesehen, speichere die Versionsnummer mit dem Spielprotokoll. Dann müssen Sie natürlich auch frühere Softwareversionen behalten, um frühere Protokolle wiederzugeben, z. B. in einem Quellcode-Repository, aber das sollten Sie wahrscheinlich trotzdem tun.
Ian Schreiber
Vielen Dank für Ihre Antwort. Das Spiel ist kostenlos (GPL-lizenziert), sodass jeder auf alte Spielversionen zugreifen und sogar den Client kompilieren kann, sodass es kein Problem ist, alle verschiedenen Versionen davon zu haben. Dies wird sehr häufig verwendet, nicht alle alternativen Server verwenden die neuesten Versionen. Es gibt Server, auf denen Versionen von 2004 ausgeführt werden.
Marco
@Marco: Ich vermute, dass SC2 so funktioniert, dass fast der gesamte Code in eine DLL eingefügt wird. Wenn eine Wiederholung geladen wird, wird die Version überprüft, die DLL für diese Version geladen und ausgeführt. Es ist etwas komplizierter, aber der Benutzer benötigt nur eine Installation und eine Exe kann alle alten Wiederholungen ausführen.
Mooing Duck
1

Eine Möglichkeit, dies in Angriff zu nehmen, ist die eines Spiels namens "Heroes of Newerth". (was sich alle +/- 2 Wochen ändert) Soweit ich das beurteilen kann:

  1. Verwenden Sie Diff-Patches für das Spiel und die Wiederholungen.
  2. Alle Wiederholungen werden in der Cloud gespeichert. Sie verfallen schließlich.
  3. Wenn der Benutzer eine alte heruntergeladene Wiedergabe ansehen möchte, muss er zuerst die Schaltfläche "Kompatieren" verwenden.
  4. Es sieht so aus, als ob sich entweder Remote von der neuesten Version unterscheidet. oder für den Fall, dass die Wiedergabe nicht mehr gespeichert ist, lädt sie hoch und führt dann den Remote-Diff aus.

Da ich bei S2 nicht arbeite, kann ich nicht sagen, dass es definitiv so funktioniert. Ich habe jedoch einen deutlichen Trend zur Downloadgröße festgestellt, der mit dem Alter der Wiedergabe zusammenhängt.

Entweder das, oder sie fügen der Wiedergabe Entity-Patches hinzu (z. B. hat der Zauber X den Y-Effekt anstelle des Z-Effekts). Wenn paketbezogene Informationen auch in der Entitätskonfiguration gespeichert sind, können Sie mit diesem Entity-Hot-Patching auch ältere Pakete verstehen.

Ich würde historisches Verhalten definitiv nicht auf dem Client speichern, da dies sehr schnell enorm werden kann. Insbesondere, wenn der Client von z. B. 10.1.0 auf 10.2.0 aktualisiert (da er jeden Patch zwischen den beiden Versionen anstelle des endgültigen Patches herunterladen muss).

Google Protobuf ist eine gute Idee als Serialisierungsschicht, da es solche Dinge von Natur aus unterstützt.

Jonathan Dickinson
quelle