Wir erstellen ein Echtzeit-Multiplayer-Spiel, bei dem jeder Spieler dafür verantwortlich ist, seinen Status bei jeder Iteration der Spielschleife zu melden.
Die Statusaktualisierungen werden mit unzuverlässigem UDP gesendet .
Um das Senden von Statusdaten zu minimieren, haben wir ein System entwickelt, das nur Deltas sendet (unabhängig davon, welche Statusdaten geändert wurden).
Diese Methode ist jedoch fehlerhaft, da ein verlorenes Paket bedeutet, dass andere Spieler das Delta nicht erhalten, wodurch sich das Spiel auf unerwartete Weise verhält.
Zum Beispiel:
Angenommen, dieser Status besteht aus: {positionX, positionY, health}
Frame 1 - positionX changed --> send a packet with positionX only.
Frame 2 - health changed // lost !
Frame 3 - positionY changed --> send a packet with positionY only.
// Andere Spieler wissen nichts über Gesundheitsveränderungen.
Wie kann man dieses Problem dann überwinden? Das Senden der gesamten Daten ist nicht immer möglich.
quelle
Sie können das Problem auch umgehen, indem Sie beispielsweise jede Sekunde eine vollständige Statusaktualisierung vom Server an die Clients senden. Wenn ein Client kein Paket empfangen hat, verhält er sich falsch, bis er die vollständige Statusaktualisierung erhält. Dann wird es wieder synchronisiert.
quelle
Viele Spiele verwenden sowohl UDP als auch TCP / IP zum Senden / Empfangen von Daten. Je nachdem, wie oft die Daten gesendet werden, wird ein anderes Protokoll verwendet.
Zum Beispiel:
UDP: Positionsaktualisierungen und alles andere, was möglicherweise mehrmals pro Sekunde gesendet / empfangen werden könnte.
TCP / IP: Inventaraktionen, Zauber- / Fähigkeitsaktionen (die meisten vom Benutzer durchgeführten Aktionen)
Es hängt wirklich von der Menge des Verkehrs jedes Artikels ab. Wenn Sie feststellen, dass Sie häufig HP Updates senden, müssen diese möglicherweise auf UDP sein.
quelle
Wenn Sie die Überprüfung des Quake 3-Quellcodes lesen , erklärt er das Netzwerkmodell, das Ihrem Design sehr ähnlich ist, jedoch eine Lösung für die verworfenen Pakete enthält.
Im Wesentlichen senden Sie in Ihrem Modell Deltas gegen den direkt vorherigen Status. Im quake3-Modell senden Sie Deltas gegen den letzten bestätigten Status vom Peer.
quelle