Wie kann ich ein Peer-to-Peer-Multiplayer-Spiel erstellen? [geschlossen]

36

Wie kann ich ein p2p-Multiplayer-Spiel machen? Ich hätte gerne ein Multiplayer-Spiel ohne Server. Aber woher kennen sich dann alle Kunden?

Warum ist das p2p-Protokoll beim Dateitransfer so berühmt, nicht aber bei Multiplayer-Spielen?

Tuomas Hietanen
quelle
Was in einem p2p-Spiel sehr interessant sein könnte, ist, einen Netcode zu erstellen, der zu einem MMO passt, um bessere soziale Aspekte zu ermöglichen: Server werden nur für Städte und Partys mit mehr als 5 Spielern benötigt. Ich weiß nicht, was machbar ist und was nicht, aber derzeit ist das das einzig Interessante an fotorealistischen Grafiken ...
jokoon
Aber P2P ist in Multiplayer-Spielen sehr beliebt! Wer hat gesagt, ist nicht? Sogar einige große MMOs nutzen P2P
Adam Harte

Antworten:

33

Peer-to-Peer-Spiele haben in der Regel noch einen Game Host. Es ist der Spielehost, der das Spiel in die Hauptspieleliste aufnimmt und neue Verbindungen akzeptiert. Wenn der Spielehost einen neuen Client für das Spiel akzeptiert, benachrichtigt er alle vorhandenen Clients über den neuen Client, damit sie sicherstellen können, dass sie eine Verbindung zum neuen Client herstellen.

P2p lässt sich am einfachsten in einer Lobby implementieren. Alle Clients stellen eine Verbindung zum Host in einer Lobby (oder einem Chatroom) her. Wenn der Host bereit ist, drückt der Spieler Start und alle betreten das Spiel zur gleichen Zeit (üblicherweise in Strategiespielen verwendet). Ein komplexerer Ansatz ist die Verwendung von "Drop-In-Drop-Out", bei dem Spieler dem Spiel beitreten und es verlassen können. Die Implementierung in einem p2p-Spiel ist jedoch sehr viel komplexer und erfordert eine Funktion namens Host-Migration.

Eine gute Anzahl von Spielen verwendet Peer-to-Peer-Netzwerke, einschließlich der meisten Strategie-, Sport- und Fahrertitel. Nahezu alle Xbox360- und PS3-Spiele verwenden P2P-Netzwerke. Die Client-Server-Architektur wird hauptsächlich in Ego-Shootern oder MMO-Spielen verwendet.

Client-Server ist im Allgemeinen einfacher zu implementieren, da nur 1 Computer den gesamten Spielstatus nicht kennt. Die Clients sind im Grunde nur Renderer mit einer gewissen Vorhersage, um die Dinge glatt aussehen zu lassen.

Wenn Sie eine p2p-Engine erstellen, benötigen alle Clients einen vollständigen Stand der Spielwelt und alle müssen synchron bleiben.

Weitere Informationen zu P2P- und Client-Server-Architekturen finden Sie im folgenden Artikel: Was jeder Programmierer über Game Networking wissen muss .

Und wenn Sie noch kein Neuling im Networking sind, lesen Sie die anderen großartigen Artikel auf dieser Website. Glenn ist ein Netzwerkgenie.

lloydw
quelle
13

Es gibt viele Gründe, warum p2p in Spielen nicht beliebt ist, hauptsächlich aufgrund von Verzögerungen. Jeder ist so langsam wie der langsamste Spieler. Wir sprechen hier nicht von Bandbreite, sondern von Ping-Zeit.

p2p kann tonnenweise Daten übertragen, aber dies geschieht mit einem recht hohen Ping-Wert. Spiele müssen sehr kleine Datenmengen mit minimaler Ping-Zeit übertragen.

Nate
quelle
13

Es gibt einige interessante Aspekte zu Peer-to-Peer-Systemen und Actionspielen. Ich habe versucht, sie als Kommentar in Glenn Fiedlers Blog zu veröffentlichen, aber anscheinend mag er es nicht, sich irren zu lassen und zog stattdessen den ganzen Artikel heraus. Es befindet sich im Internetarchiv, falls Sie es lesen möchten.

Er hat den Kommentar nicht online gehen lassen, daher zitiere ich ihn hier:

Der Peer-to-Peer-Vorschlag aus dem ersten Beitrag ist tatsächlich ein interessanter Ausgangspunkt, auch wenn er manchmal etwas naiv ist: Die erste Möglichkeit wäre, das System mit einem Standard-Client / Server-Modell mit Vorhersage zu kombinieren, wie in Ihrem Beitrag beschrieben über Spielevernetzung. Der niedrigere P2P-Ping würde die Vorhersageverzögerung zwischen den Spielern je nach Standort drastisch verringern: Der Effekt wäre für die meisten US-Spieler wahrscheinlich nicht sichtbar, aber hier in Europa sind Pings von 200+ auf den meisten Servern normal und eine direkte Verbindung würde die Vorhersageverzögerung verringern Vorhersageverzögerung zu der eines europäischen Servers.

Ein echter P2P-Ansatz ohne Server ist etwas komplexer: Ein Hauptanliegen bei dezentralen Netzwerken ist die Sicherstellung der Konsistenz, insbesondere, wenn die Simulation unter Butterfly-Effekten leiden könnte, da sich das Timing von Befehlen, die über das Netzwerk gesendet werden, oder Gleitkomma-Probleme geringfügig unterscheiden. Dies ist möglich, indem der Status jedes Objekts (Spieler, NPCs, ...) mindestens in regelmäßigen Abständen vernetzt wird. Es wäre nicht einmal notwendig, dies für alle Objekte gleichzeitig zu tun, und jeder Kunde könnte bestimmte Objekte in Besitz nehmen. Das Vernetzen von genügend Objekten in einer bestimmten Zeit sollte den Unterschied dämpfen, der sich zwischen den einzelnen Synchronisationen eines Objekts aufbaut, und selbst für Synchronisationsintervalle von einer Sekunde oder mehr irrelevant sein.

Das zweite Problem bei P2P-Systemen ist die Sicherheit, das kann in diesem Fall jedoch mit einem relativ kleinen Fix behoben werden: Die Clients können mithilfe ihrer Physiksimulationen Informationen über die Fehlerstufe für jedes Physikobjekt sammeln. Manipulierte Physik führt immer zu einem größeren Fehler, sodass die Clients einfach "abstimmen", um sich von dem Peer zu trennen, der ein verdächtiges Objekt kontrolliert. Außerdem werden Steuerungsnachrichten für nicht-physische Objekte zwischen Clients basierend auf ihrer Wichtigkeit weitergeleitet: Spieler-Updates können zufällig weitergeleitet werden, wichtige und seltene Updates sollten immer gesendet werden, aber immer noch an einen zufälligen Spieler. Auf diese Weise müsste ein Spieler einen großen Teil der verbundenen Clients kontrollieren, um auf irgendeine wahrnehmbare Weise betrügen zu können.

[...]

Den Thread, auf den ich verweise, finden Sie unter http://www.devmaster.net/forums/showthread.php?t=14640 .

Ich denke, jemand erwähnte die Firewall-Probleme, die Peer-to-Peer in einem der Threads aus dem Artikel hat. Eine mögliche Lösung wäre ein NAT-Punchthrough:
- Überblick über NAT-Punchthrough
- Peer-to-Peer-Kommunikation über Netzwerkadressübersetzer hinweg

Es gibt keine 100% ige Erfolgsquote, also solltest du den Spielern sagen, dass sie trotzdem einen Port eröffnen sollen.

Tamschi
quelle
+1, damit nur die Person die Frage beantwortet, danke dafür. Eine Frage: Sie haben die Schmetterlingseffektunterschiede beim außer Kontrolle geratenen Status erwähnt (ich habe dies in mehreren schlecht geschriebenen Interplay-Spielen gesehen). Was sollen wir tun, wenn wir feststellen, dass der Zustand zwischen den Maschinen unterschiedlich ist? Was passiert, wenn mein Computer glaubt, dass eine Einheit gestorben ist, aber der Computer meines Gegners glaubt, dass eine andere Einheit gestorben ist? Wie entscheiden wir, wessen Wort wir nehmen?
BlueRaja - Danny Pflughoeft
@BlueRaja Starcraft ist eigentlich kein gutes Beispiel dafür, da sein Motor zu 100% deterministisch ist. Sie müssen die Player-Befehle nur mit Zeitstempeln zuverlässig übertragen, und Computer, die dasselbe Programm verwenden, stimmen immer mit dem aktuellen Status überein. Eine gute Möglichkeit, Unterschiede zu verringern, besteht darin, jedes Statusupdate mit dem Zeitstempel (physischer Frame oder Tick) zu versehen und einige dieser Frames auf dem empfangenden Computer zwischenzuspeichern. (Die meisten FPS-Spiele sind CS: S und TF2.) Verwenden Sie auch keine Gleitkommazahlen für wichtige Dinge, da sich deren Implementierung unterscheiden kann.
Tamschi
Wenn eine Engine zu 100% deterministisch ist (es gibt Physikbibliotheken, die dies garantieren) und den Status zwischen Computern mithilfe von Frame-Caching synchronisiert, wird der Butterfly-Effekt zu 0. (Solange Sie eine zuverlässige Verbindung garantieren können.) Eine zusätzliche Der Vorteil ist, dass Sie betrügerische Clients relativ leicht identifizieren können, da der einzige Weg, unterschiedliche Ergebnisse zu erzielen, darin besteht, unterschiedlichen Code zu haben. Beachten Sie, dass dies je nach Netzwerkleistung möglicherweise nicht für jeden Aspekt des Spiels möglich ist. Schmutz wird aus diesem Grund oft nicht synchronisiert. Schnelle Spiele können oft nicht alles synchronisieren.
Tamschi
Da der Blog- Eintrag
inzwischen
9

Ein gutes Beispiel für ein echtes Peer-to-Peer-Gameplay wäre ein Echtzeit-Strategiespiel wie Starcraft.

In einem Spiel mit Hunderten von Einheiten / Projektilen in Bewegung ist es nicht praktikabel, wiederholt Einheitenpositionen / -zustände über das Netzwerk an alle anderen Spieler zu senden. Daher besteht eine Lösung darin, dass alle Spieler die (exakt gleiche) Simulation synchron ausführen.

Wenn ein Spieler eine Aktion ausführt, kann der Befehl / Befehl ('Zergling nach X, Y verschieben') an alle anderen Spieler gesendet werden, um von allen Instanzen der Simulation einen Bruchteil einer Sekunde später ausgeführt zu werden.

In dieser Situation kann das Spiel fortgesetzt werden, wenn ein Spieler die Verbindung trennt. Da für die Ausführung des Spiels kein Server / Host erforderlich ist, können die verbleibenden Spieler weitermachen.

Das Synchronisieren der Spiele ist jedoch nicht trivial. Sie müssen einen festen Zeitschritt für die Aktualisierung der Spiellogik verwenden und beim Verwenden und Setzen von Zufallszahlengeneratoren sehr vorsichtig sein, um sicherzustellen, dass die Simulationen nicht divergieren!

Bluescrn
quelle
5

Es wäre ein bisschen unaufrichtig zu behaupten, dass es nicht für Spiele berühmt ist, wenn die meisten Echtzeit-Strategiespiele (Star Craft-Serie, Command and Conquer-Serie) und viele FPS-Spiele (Call of Duty: Modern Warfare 2) es verwenden.

Das heißt, wie man etwas über das Spiel erfährt, hängt von dem Matchmaking- / Lobbying-Service ab, den Sie verwenden oder erstellen. Aber selbst wenn man etwas über das Spiel erfährt, kann es dennoch einen oder mehrere Kollegen geben, die gleichwertiger sind als andere. Stellen Sie sich den Fall vor, dass 3 Kunden spielen möchten, einer hinter einem offenen und zwei hinter einem strengen (geschlossenen) Netz. Der Open-Nat-Peer kann Verbindungen von den anderen beiden nehmen. Aber die 2 strikten können sich nicht direkt miteinander verbinden, sie werden das Open Nat benötigen, um die Pakete weiterzuleiten. Wenn der Open-Nat-Peer aus dem Spiel ausscheidet, muss entweder ein anderes Relais gefunden werden, oder das Spiel wird unterbrochen.

Doug-W
quelle
2

Vielleicht möchten Sie auch Badumna (www.badumna.com) ausprobieren, das behauptet, eine Peer-to-Peer-Netzwerklösung für Online-Spiele zu sein. Es scheint die Synchronisation des Spielstatus auf verteilte Art und Weise durchzuführen und laut ihrer Website wird es eine Flash-Version geben.

John
quelle
1

Sie möchten wahrscheinlich mit einem Spieler (wir nennen ihn den "Host") als nicht autorisierenden Server laufen. Alle anderen Spieler müssen mit unserem Gastgeber kommunizieren, was sie gerade tun, und der Gastgeber leitet die Nachrichten an die anderen Spieler weiter.

Sie möchten wahrscheinlich auch eine Liste der mit dem Hosting-Player verbundenen Computer weitergeben, damit ein neuer Host ausgewählt und die Kommunikation mit den verbleibenden Playern gestartet werden kann, wenn dieser gelöscht wird.

Die Dokumentation für smartfoxserver kann Ihnen helfen und / oder Sie möchten sie möglicherweise auch für Ihr Spiel verwenden. Sie haben es einfach in Ihr Client-Spiel eingebettet, anstatt ein separates Client- und Server-Programm zu haben.

lathomas64
quelle
1
Dies scheint weniger ein p2p-Setup als vielmehr ein spontaner Server / Client zu sein.
deft_code
@caspin Dies sind die meisten, wenn nicht alle p2p-Spiele ausgeführt werden. Ein Spieler wird zum Gastgeber bestimmt und der Rest verbindet sich mit ihm.
AttackingHobo
2
@Hobo: das ist nicht p2p, das ist client / server, egal wie du es nennst.
o0 '.
1

Ich bin ein bisschen an dieser Sache interessiert. Sie sagen, dass es viele Probleme gibt, ein Game-P2P anstelle eines klassischen Client-Server-Modells zu erstellen. Aber ich bin mir ziemlich sicher, dass p2p wie ein Client-Server ist, aber jeder Peer hat die Chance, ein Server zu werden. Über die LAG: Wenn Sie eine weitere Maschine als Server hinzufügen, ist die Wahrscheinlichkeit größer, dass viele Clients weiter vom Server entfernt sind. Mit p2p befinden sich jedoch keine zusätzlichen Maschinen in der Lobby. Sie können die Latenztests verwalten und Gruppen mit minimalem Ping erstellen. Wie ich erfahren habe, müssen Sie die Clients bitten, weniger als weniger Daten zu übertragen, damit die Clients herausfinden, was die anderen Clients zu bedeuten bereit sind.


quelle
gta4 auf xbox 360 ist p2p, also ist es möglich und es gibt kaum Verzögerung
-1

Wenn Sie ein relativ einfach aussehendes MMORPG mit geringen Systemanforderungen erstellen, würde ich vorschlagen, ein internes Programm zu erstellen, das eine "Häufigkeit" basierend auf dem Inhalt des Spielordners und dem Inhalt der Dateien erstellt. Dies lässt Leute mit der gleichen "Frequenz" auf den gleichen Kanälen spielen. Modifizierte, manipulierte oder normale Clients werden getrennt. Dies funktioniert nur für native Hacks oder Mods, aber ich bin sicher, dass dies alle "dummen" Betrüger abdeckt. In Kombination mit der von einer Person erwähnten Fehlerprüfungsmethode ist nur eine geringe bis keine Moderation erforderlich. Was die Ports anbelangt, lassen Sie es einfach Port 52225 mit einem Hintergrundprozess abdecken, der es auf Routern ohne Trigger-Ports angeschlossen hält.

Devin Foret
quelle