Spiel - Multiplayer

java
lockstep
client
multiplayer
server

#1

Hey Leute,

ich arbeite gerade in meiner Freizeit an einem 2d Spiel, bei welchem sich zwei Spieler mit ihren Festungen gegenüberstehen und jeweils Einheiten bauen können, um den Gegenspieler anzugreifen. Ihr könnt euch das so vorstellen wie Age of War [0]. Sehr gerne würde ich in der Zukunft einen Multiplayermodus einbauen, bei dem zwei Menschen online gegeneinander spielen können. Dabei habe ich mich auch schon bezüglich der Umsetzung informiert und habe folgende Ergebnisse gesammelt:

Peer-to-Peer Lockstep [1]

  • Im Prinzip läuft auf beiden Rechnern das selbe Spiel. Befehle wie “Einheit gebaut” oder “Einheit schießt” werden übertragen und zum jeweils selben Zeitschritt ausgeführt
  • Wenn das Spiel deterministisch ist, wird bei beiden Spielern das Ergebnis der Aktionen auch gleich sein
  • Das Spiel deterministisch zu machen scheint wohl sehr schwer zu sein (außer man arbeitet direkt auf einem ziemlich hohen Level und z.B. nimmt die Engine den ganzen Aufwand ab). Zum Beispiel reichen Hardwareunterschiede aus, dass bei Rechnungen manchmal leicht verschiedene Gleitkommazahlen rauskommen und sich auf lange Sicht Unterschiede bei den beiden Spielern ergeben [2] [3] [4]

Client/Server [5]

  • Es gibt nur noch einen Rechner, welcher das Spiel ausführt / simuliert: der Server
  • Clients kommunizieren mit dem Server um Spieldaten zu senden/erhalten
  • Der Server kann ein unabhängiger Rechner oder auch einer der Spieler sein
  • Spiel muss nicht deterministisch sein
  • Clients müssen Spielcode nicht ausführen, sondern im Prinzip nur vom Server alle relevanten Spieldaten erhalten. Clients senden ihre Eingaben an Server, der diese verarbeitet
  • Problem bei z.B. RTS: Spieler mit schlechter Verbindung hat entsprechende Verzögerung im Spiel. Bei meinem Age-of-War-ähnlichen Spiel sollte aber selbst eine Verzögerung von einer Sekunde tragbar sein

Client-Side Prediction [6]

  • Wie Client/Server, nur läuft hier zusätzlich auf dem Client der Spielecode. Dadurch läuft das Spiel auch bei schlechter Verbindung flüssig
  • Bei langsamer Verbindung vom Client kann es den Anschein machen, dass sich Spielobjekte “teleportieren”, wenn der Client deren Bewegung schlecht vorausgeschätzt hat und die tatsächliche Position des Objekts als Paket bekommt
  • Falls sich Simulation des Clients von der des Servers unterscheidet, setzt sich i.d.R. der Server durch

Jetzt habe ich folgende Überlegung:

  • Verwenden von Client/Server Architektur
  • Einer der beiden Spieler ist Server, der andere ist Client
  • Der Client simuliert das Spiel (fast) nicht, sondern sendet nur Eingaben und erhält nur graphische Informationen: Welche Textur soll wo gezeichnet werden und welche Geschwindigkeit/Beschleunigung hat das dazugehörige Objekt gerade? Bzw. jedes Mal wenn ein Ton abgespielt werden soll, wird auch ein passendes Paket dafür geschickt.

Dadurch muss das Spiel nicht deterministisch sein. Es könnte eine minimale Verzögerung für den Client geben, die ich aber bei dieser Art von Spiel auch akzeptieren würde.

Was haltet ihr von diesem Ansatz? Habt ihr weitere Ideen oder Verbesserungsvorschläge?

Freundliche Grüße
Felix