2012-10-19 4 views
7

Hallo Ich versuche, ein Echtzeit-Multiplayer-Spiel mit node.js und socket.io zu bauen.Wie teuer ist es, ein Echtzeit-Multiplayer-Spiel mit node.js/socket.io zu erstellen?

Nun, die Implementierung selbst in Bezug auf die Codierung wird nicht so sehr ein Problem sein, aber aus einem traditionellen http Anfrage-Antwort-Web-Programmiermodell, habe ich keine Ahnung, wie teuer das in Bezug auf Verkehr und Server wäre Belastung. Während eines Spiels sollte der Browser eines Spielers Echtzeit-Mauseingabeereignisse verfolgen und sie an alle anderen Spieler im selben Spiel weiterleiten.

Hier ist ein Beispiel, lassen Sie uns sagen, mein Avatar folgt um meinen Mauszeiger auf dem Bildschirm, und es sollte in Echtzeit zu den Spielern auf dem Bildschirm übertragen werden. Ich würde so etwas wie:

// client side 
$(document).on("mousemove", function(event){ 
    io.emit("coordinate", {x: event.pageX, y: event.pageY}); 
}); 

und auf dem Server:

// server side 
io.sockets.on("connection", function(socket){ 
    ... 
    socket.on("coordinate", function(coordinate){ 
     socket.get("username", function(err, username){ 
      socket.broadcast.emit("move", {username: username, coordinate:coordinate}); 
     }); 
    }); 
    ... 
}); 

ich denke, das sollte funktionieren, aber dies erfordert den Browser an den Server pro Sekunde mehrere Ereignisse zu emittieren, die sollte sie anschließend ausgestrahlt um die Spieler im selben Spiel zu ruhen, und ich bin besorgt über die Auswirkungen davon. Eine Sache ist jedoch, dass die Größe jedes Datenfragments, das übertragen wird, nicht so groß ist (im Grunde ist es nur eine x- und y-Koordinate). Wenn das zu teuer ist, egal wie groß das Spiel ist, glaube ich nicht, dass ich es versenden kann. Könnte mich jemand aufklären? Vielen Dank.

[EDIT] Um zu klären, ich frage nicht, wie diese Architektur effizienter zu machen. Ich möchte nur wissen, ob diese Art von System in Bezug auf Systemlast (und Wartungskosten) realistisch genug ist. Für gewöhnliche Web-Dienste kann ich die Kosten einfach abschätzen, indem ich Seitenzahlen betrachte, aber Websocket ist ein völlig neues Feld, das mir nicht bekannt ist von, also wollte ich fragen.

Antwort

5

Vorbehalt: alle Zahlen sind geschätzt und An manchen Stellen gibt es Gemeinkosten, aber Sie sollten irgendwo anfangen.

Wenn Sie nur Daten zwischen Verbindungen hin- und herschieben, scheint es unwahrscheinlich, dass der Server Ihr Engpass sein wird. Ich denke, du wirst deine erste Wand mit Bandbreite (am Spielerende und/oder am Ende des Datenzentrums) erreichen.

Angenommen jeder Benutzer drückt Mausdaten durchschnittlich 25 mal pro Sekunde das bedeutet, dass jeder wird Spieler x 25 pro Sekunde werden heruntergeladen. Angenommen, jede Mausbewegung Nachricht ist 100 Bytes und es gibt 20 Spieler das heißt, Sie sind (naiv) Download ~ 50kb pro Sekunde, die ziemlich hoch, aber erreichbar ist. Ich sage naiv, weil es Overheads geben wird, aber mit einer anständigen Verbindung fühlt es sich machbar an.

Die Download-Bandbreite ist linear mit der Anzahl der Spieler, also bei 100 Spielern wäre es mehr wie 250kb/s am Client-Ende und 22Mb/s am Server-Ende.

Wenn Sie mehr Spieler benötigen, müssen Sie Optimierungen finden, z. Trimmen der Nachrichten, Datenkompression, die Maus Abtastgeschwindigkeit Begrenzung usw.

1

Werden die Avatare wirklich der Maus folgen oder werden sie sich auf Orte auf einer Karte bewegen, auf die geklickt wird? Wenn Letzteres dann nur Click-Locations auf den Server übertragen muss, muss der Server nur Avatar-Wegpunkte und Reisegeschwindigkeit an die Clients senden.

Dies hat immer noch Einschränkungen in Bezug auf die Anzahl der Objekte und Spieler, die verwaltet werden müssen, aber der Server kann Aktionen mit 1/10 Sekunde oder 1/4 Sekunde für mehrere Avatare und Objekte sammeln und teilen als Bündel ausgeben und dadurch die Netzwerk-, Server- und Client-Last reduzieren.

+0

Danke für die Antwort, aber um zu klären, wollte ich nicht fragen, wie man das mehr macht effizient. Ich wollte wissen, wie viel Ladung diese Art von App genau haben wird - ob die Spezifikation machbar ist oder nicht. Danach kann ich darüber nachdenken, es effizienter zu machen. Aber für jetzt würde ich gerne eine Baseball-Figur wissen, wie viel Ladung diese Art von App erstellen wird. – Vlad

3

Die eine Million Dollar Frage ist: I just want to know if this type of system is realistic enough in terms of system load (and maintenance cost). Ich denke, das ist sehr relativ. Relativ zu Codierung, Hardware, Anzahl der Benutzer.

Der Vorschlag von Leon ist gut, verfolgen Sie nur den Mausklick und verfolgen Sie nicht die Mausbewegung. In dieser Art von Spiel ist jede Strategie zur Reduzierung der Anfragen/Antworten willkommen.

Beantworten Sie Ihre Frage, ich sagte noch einmal, es ist relativ, Ihre Anfang (mit node.js und websockets) klingt gut, und es könnte für 1.000 Benutzer gleichzeitig arbeiten, konnte aber nicht für 1.000.000 arbeiten, aber die Derselbe Code, mit einer besseren Hardware, könnte für 1.000, 1.000.000, 1.000.000.000 Benutzer funktionieren, es ist eine Infrastrukturfrage. Ich denke, die Prämisse ist be carefully in your code to mantain the system lightwheigt, denn wenn Sie wissen, dass Ihr Code gut ist, wird das Problem die Hardware, Bandbreite, etc (und Sie könnten darüber später kümmern.)

1

ich etwas sehr ähnliches getan haben ...

Alle Spieler Daten an den Server auf eigene Rate senden (hoffentlich etwa 30 Frames pro -second) Der Server sammelt die Daten von jedem Spieler und legt den neuen Zustand (Position der Spielermaus) fest. Der Server hat einen Timer mit 30 Frames pro Sekunde - sendet eine einzige Nachricht an alle Spieler mit allen Mauspositionen des Spielers. Es macht die Nutzlast größer, aber sendet nur 30 Pakete pro Sekunde - kein Problem für Knoten oder moderne Browser.

Viel Glück mit Ihrem Spiel!

Dan

PS - Denken Sie daran, Sie haben für die Geschwindigkeit zu entwerfen!

1

Betrachten Sie es so.

Wenn Sie wirklich wollen ein massives Multiplayer-Spiel mit Echtzeit-Updates zu bauen, dann nach der stats hier, WebSockets, wenn Ihre beste Wette. (socket.io ist eine praktische Bibliothek, die Fallbacks bereitstellt, sollte aber so konfiguriert sein, dass sie hauptsächlich Websockets verwendet.)

Richard hat einige solide Schätzungen gemacht. Allerdings gibt es zwei weitere Dinge, die Sie beachten müssen:

  • maximale Anzahl der offenen Verbindungen (google für ulimit)
  • Parallelisierung (node.js auf einem einzigen Thread ausgeführt wird, und das wird vielleicht nie in die ändern Zukünftig, wenn Ihre Änderungen gesendet werden, wird eine ungefähr O (n) Leistung für Ihr Spiel annehmbar sein?)
Verwandte Themen