2012-03-29 9 views
2

Ich baue ein Massively Multiplayer-Spiel mit Node.js und Socket.io. Alle Spieler werden sich auf derselben unendlichen Karte bewegen (denke Minecraft). Wenn der Spieler sich bewegt, lade ich die für ihn sichtbaren Steine. Wenn Spieler ihre Bewegung bewegen, sollten sie an alle Spieler gesendet werden, die sie sehen können.Verwalten von Sockets in einem Multiplayer Socket.io Spiel

Meine Frage ist; Wie sollte ich meine Sockets strukturieren? Einen Sockel für alle Spieler zu haben scheint nicht skalierbar zu sein. Ich könnte die Welt in Stücke zerbrechen, aber ich bin nicht sicher, wie man die Chunk-Grenzen verwaltet. Da die meisten Spieler die meiste Zeit nicht in der Lage sein werden, sich gegenseitig zu sehen, würde ich es bevorzugen, dass der Sockel jedes Spielers nur Updates erhält, die für sie relevant sind.

Ich habe gelesen, dass Socket.io ein Konzept von "Räumen" hat, die nur Sockets sind, die die gleichen Nachrichten erhalten. Wäre es möglich, einen separaten Raum für jeden verbundenen Spieler zu haben, zu dem ich den Sockel eines anderen Spielers hinzufügen würde, der sich in der Nähe bewegt? Dann konnte ich jedes Mal, wenn der Spieler sich bewegte, eine Nachricht an diesen Raum senden. Wie könnte ich es dann schaffen, wenn Zuschauer den Raum verlassen oder sich ihm anschließen?

Offensichtlich ist dies eine vage Frage, aber ich suche nur nach Best-Practice-Tipps. Links zu Artikeln zu diesem Thema wären willkommen.

+1

Haben Sie darüber nachgedacht, [Quadtrees] (http://en.wikipedia.org/wiki/Quadtree) zu verwenden, um nach dem Standort des Spielers zu suchen? Ein guter Ausgangspunkt für die Suche nach einer Lösung wäre die [BrowserQuest-Quelle] (https://github.com/mozilla/BrowserQuest). – hughsk

Antwort

3

Dies ist eines der wesentlichen Probleme beim Entwerfen von MMO-Servern. Im Allgemeinen möchten Sie einen Socket pro Client und Sie implementieren eine Logik einen Client für eine bestimmte Region.

Regionen sind eine gute Möglichkeit, Kanäle einzurichten, um Datenabonnements zu steuern. Sie können separate Namen für jede Region verwenden und Socket.io-Räume verwenden, um Spieler für eine Region zu abonnieren.

Nachdem all dies läuft, werden die Dinge viel einfacher zu handhaben. Wenn sich ein Spieler in einer bestimmten Region bewegt, muss der Server das Ereignis "Spieler bewegt" nur an alle Abonnenten aller Regionen innerhalb von X Metern des Ereignisses senden.

+0

Was meinen Sie mit "Socket pro Client"? Ist es ein Websocket-Server pro Client (also unterschiedliche IP oder Port für jeden Client) oder eine Verbindung pro Client innerhalb desselben Servers ip/port? Ich habe das gleiche Problem, aber mit Ratchet. –