Ich möchte ein einfaches Client-Server-Echtzeit-Multiplayer-Spiel als Projekt für meine Netzwerkklasse erstellen.
Ich habe viel über Echtzeit-Multiplayer-Netzwerkmodelle gelesen und verstehe die Beziehungen zwischen dem Client und dem Server sowie die Verzögerungskompensationstechniken.
Was ich tun möchte, ist etwas Ähnliches wie das Quake 3-Netzwerkmodell: Im Grunde speichert der Server eine Momentaufnahme des gesamten Spielzustands. Nach Eingang der Eingaben von den Clients erstellt der Server einen neuen Snapshot, der die Änderungen widerspiegelt. Anschließend werden die Unterschiede zwischen dem neuen und dem letzten Snapshot berechnet und an die Clients gesendet, damit diese synchronisiert werden können.
Dieser Ansatz scheint mir wirklich solide zu sein - wenn der Client und der Server eine stabile Verbindung haben, wird nur die minimale Datenmenge gesendet, die erforderlich ist, um sie synchron zu halten. Wenn der Client nicht mehr synchron ist, kann auch ein vollständiger Snapshot angefordert werden.
Ich kann jedoch keinen guten Weg finden, um das Schnappschuss-System zu implementieren. Es fällt mir wirklich schwer, mich von der Single-Player-Programmierarchitektur zu lösen und darüber nachzudenken, wie ich den Spielstatus so speichern kann, dass:
- Alle Daten sind von der Logik getrennt
- Zwischen Momentaufnahmen von Spielzuständen können Unterschiede berechnet werden
- Spieleinheiten können immer noch einfach per Code manipuliert werden
Wie wird eine Snapshot- Klasse implementiert? Wie werden die Entitäten und ihre Daten gespeichert? Verfügt jede Client-Entität über eine ID, die mit einer ID auf dem Server übereinstimmt?
Wie werden Schnappschussdifferenzen berechnet?
Allgemein: Wie würde ein Snapshot-System mit Spielstatus implementiert?