Wie strukturiere ich einen einfachen Spieleserver für ein Multiplayer-Spiel?

9

Ich möchte einen einfachen Multiplayer-Spieleserver für ein einfaches Spiel erstellen:

Das Spiel soll Command & Conquer ähneln, Sie haben ein paar Panzer und ein paar Soldaten. Sie können einen Soldaten auswählen und dann auf die Karte klicken, wohin der Soldat gehen soll. Wenn der Soldat in ein Gebiet kommt, in das er nicht gehen konnte, geht er herum. Und Soldaten können von Feinden abgeschossen werden.

Wie soll ich den Spieleserver strukturieren und was soll auf dem Client gemacht werden?

Das heißt, wenn sich ein Soldat von X nach Y bewegt, aber um Gebäude Z herum, muss der Server wohl genau berechnen können, wo sich der Soldat befindet (falls ein Feind auf ihn schießt), und der Kunde muss auch die Position für kennen den Soldaten malen.

Was sollte auf dem Server getan werden und ich denke, ich muss ein Protokoll dafür entwerfen. Ich denke, der Server muss den Spielstatus und die Uhrzeit verfolgen. Hat jemand Vorschläge dazu? oder könnte man etwas lesen empfehlen?

Jonas
quelle

Antworten:

12

Im Allgemeinen ist das ein sehr komplexes Thema. Sie haben zwei widersprüchliche Ziele (zumindest, wenn Sie nicht vorhaben, jedes einzelne Spiel auf einem dedizierten Server auszuführen):

  1. Sie möchten so viel wie möglich auf dem Server tun, um Betrug zu verhindern und um sicherzustellen, dass alle Clients die gleichen Dinge sehen.
  2. Sie möchten aber auch, dass die Dinge fair sind. Wenn eine Person einen 0-maligen Ping an den Server hat, während andere eine Netzwerkverzögerung haben, und beide gleichzeitig einen Befehl an ihre Einheiten senden, hat der "Server" -Spieler einen Vorteil .

Ich kann nicht genau sagen, wie ich das für ein RTS lösen soll. Was wir für unser FPS-Feuern tun, ist, dass der Server vor einiger Zeit einen vollständigen Weltzustand speichert und den Client jeden Schuss mit einem Zeitstempel versehen lässt. Wenn die Netzwerknachricht für "Ich habe gefeuert!" Wenn der Server den Server erreicht, kann er die Welt zurücksetzen und Kollisionstests usw. für die Welt durchführen, "wie er nach dem Client gesucht hat, als der Schuss abgegeben wurde".

Wenn Sie viele Einheiten planen, besteht auch das Problem, dass der Server möglicherweise zu viel verarbeitet. Wenn Sie sich keine großen Sorgen über Hacking oder Betrug machen, würde ich empfehlen, auf den Clients eine Pfadfindung durchzuführen und die Ergebnisse an den Server zu senden.

Eine weitere Option könnte darin bestehen, stattdessen Peer2Peer zu verwenden und jeden Kunden mit den Aktualisierungen für die lokalen Teams zu beauftragen. Dies wirft jedoch die Frage auf, wie zu bestimmen ist, wer was trifft und so weiter.

Abhängig davon, wie komplex dieses Projekt ist und wie viel Aufwand Sie dafür aufwenden möchten, wäre mein bester Vorschlag, etwas Vorläufiges zu entscheiden und daran zu arbeiten, um es zu testen.

Limette in Scheiben geschnitten
quelle
1
Tatsächlich gibt es drei (oder vielleicht mehr) widersprüchliche Ziele. Das dritte ist die Leistung. Das Beibehalten und Aktualisieren des Status eines Echtzeitspiels auf dem Server verbraucht viele Ressourcen.
Bart van Heukelom
2
Oh, und Sie können # 2 leicht lösen, indem Sie eine künstliche Verzögerung einführen, die dem Durchschnitt der Verzögerung der anderen Spieler entspricht. Wenn Sie "es für alle schlecht machen" als Lösung bezeichnen können, dann ist das eine Lösung.
Bart van Heukelom
@Bart: teilweise wahr, aber natürlich sollte es eine Obergrenze dafür geben, wie viel Verzögerung Sie künstlich einführen, oder langsamere Verbindungen könnten ständig schnellere Verbindungen dazu zwingen, zu viel Verzögerung zu verursachen, was definitiv jetzt das ist, was Sie wollen.
o0 '.
Das Finden des besten Pfades ist kein Problem, wenn dies auf dem Client erfolgt, solange er die Lösung gefunden hat, sendet er sie an den Server, der - wie bei jeder Bewegung - prüft, ob sie korrekt ist.
o0 '.
2

Grundsätzlich gibt es zwei Ansätze:

  1. Vertrauenswürdiger Kunde
  2. Nicht vertrauenswürdiger Kunde

Der vertrauenswürdige Client ist etwas komplexer, hat jedoch den Vorteil, dass Sie einen Großteil Ihrer Berechnungen vom Server auslagern können. Die Kosten für den Serverbetrieb sind eines der größten Probleme bei Multiplayer-Spielen und verringern Ihre Skalierbarkeit erheblich.

Ein guter Ansatz (für Anfänger) besteht darin, jedem Kundenkunden seine eigenen Einheiten zu überlassen. Im nächsten Schritt können Sie Ersatzzyklen verwenden, damit Spieler-Clients die Aktionen anderer Clients überprüfen können. Der Server sollte nicht mehr tun müssen, als Nachrichten auszutauschen, die Synchronisierung aufrechtzuerhalten und die Persistenz sicherzustellen (z. B. Datenbank).

Wenn Sie eine Lobby oder einen Chat planen, können Sie jedes dieser Themen auf einem zusätzlichen Server behandeln. Es wird die Dinge auf der Straße viel einfacher machen.

Andreas
quelle
Danke, das war informativ. Ich denke, ich werde mich für nicht vertrauenswürdige Clients entscheiden und die Arbeit auf dem Server erledigen. Ich werde am Anfang nicht viele Spieler haben.
Jonas
1
"Ich werde nicht viele Spieler haben ..." Ich kann die Anzahl der Entwickler nicht zählen, die mir diese Zeile geben und sechs Wochen später zurückkommen mit: "Ich habe diese 5000 Spieler, die zahlen wollen, um mein Spiel zu spielen, aber ich kann nicht skalieren :( ". Denken Sie daran!
Andreas
9
"Vertrauenswürdiger Kunde" ist kein Ansatz, sondern ein Fehler.
o0 '.