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?
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?
Antworten:
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.
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.
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.
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!
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.
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.
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.
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.
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.