Tipps für die Kommunikation zwischen JS-Browsergame und node.js Server? [geschlossen]

7

Ich bastele an einem einfachen Canvas-basierten Höhlenflieger-Spiel herum und möchte es irgendwann im Mehrspielermodus spielen. Es ist geplant, Node.js auf der Serverseite zu verwenden.

Die übertragenen Daten würden aus der Position jedes Spielers, der Richtung, der Geschwindigkeit usw. bestehen. Die Spielerbewegungen sind einfache Kraftphysik, daher sollte ich in der Lage sein, Bewegungen vor dem nächsten Update vom Server zu extrapolieren.

Irgendwelche Tipps oder Best Practices auf der Kommunikationsseite? Ich denke, Web-Sockets sind der richtige Weg. Sollte ich Informationen in jedem Durchgang der Spielschleife oder in festgelegten Intervallen senden? Es macht mir auch nichts aus, wenn es mit älteren Browsern nicht funktioniert.

Petteri Hietavirta
quelle

Antworten:

10

Ich habe kürzlich mit Node.js / JavaScript einen Crossover zwischen Asteroiden und Geometriekriegen durchgeführt:
http://github.com/BonsaiDen/NodeGame-Shooter

Es hat einen fetten Server, der das Spiel verarbeitet, und Thin Clients, die im Grunde nur Ansichten sind. Der Client führt einige Interpolationen und Dinge durch, damit es reibungslos aussieht.

Möglicherweise möchten Sie sich diese beiden Dateien ansehen, die die zugrunde liegende Netzwerklogik sowie die Akteur- und Clientmodelle enthalten:
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/client/nodegame.client. js
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/nodegame.js

Das ganze Spiel basiert auf Schauspielern, die ihre "Update-Ereignisse" (die Dinge, die an die Kunden gesendet werden) größtenteils selbst behandeln. Es ist auch möglich, Akteure vor einem bestimmten Kunden zu verstecken, um beispielsweise Unsichtbarkeit zu implementieren.

Man kann auch Spiele aufzeichnen und die Nachrichten einfach in den Client einspeisen, um sie wiederzugeben.

Was die Technik angeht:
WebSockets sind der richtige Weg hierher. Ich habe auch eine benutzerdefinierte Binärcodierung für JS durchgeführt, die zwar auf mehr als 2 Dezimalstellen in Gleitkommazahlen verzichtet, aber etwa 50% kleiner als JSON ist (und unter V8 2x so schnell ist wie die native JSON-Codierung).

Ivo Wetzel
quelle
Vielen Dank! Dieser NodeGame Shooter sieht ziemlich interessant aus, ich muss einige Zeit mit seinem Code verbringen.
Petteri Hietavirta
8

Ich würde vorschlagen, die Dinge auseinander zu halten.

In Stendhal, einem in Java geschriebenen 2D-MORPG, haben wir Folgendes getan und es funktioniert ganz gut:

  • Der Client verwendet eine schnelle Schleife zum Zeichnen. Es macht reibungslose Animationen und einige Vorhersagen, um Verzögerungen zu minimieren.
  • Der Server verwendet eine Schleife, um die gesamte Spiellogik zu verarbeiten. In unserem Fall kann es viel langsamer sein als die Zeichenschleife. Während die Clients einige Vorhersagen treffen, gewinnt der Server immer.

Die Kommunikation zwischen Client und Server erfolgt über Aktionen und Wahrnehmungen:

  • Von den Benutzern ausgeführte Aktionen wie "Nach oben" werden bei ihrem Auftreten an den Server gesendet. Der Server stellt sie in die Warteschlange und verarbeitet sie in einer eigenen Schleife.
  • Wahrnehmungen werden vom Server an den Client gesendet, um deren Sicht auf die Welt zu aktualisieren.

Wir haben einige "Tricks" gemacht, um zusätzliche Leistung zu erzielen:

  • Wir haben zwei Arten von Wahrnehmungsnachrichten: Eine vollständige, die beim Anmelden und beim Beitritt von Spielern zu einer Zone verwendet wird. Und inkrementelle Updates, die danach verwendet werden. Dies spart viel Netzwerkbandbreite.
  • Wir teilen Wahrnehmungsnachrichten in einen öffentlichen und einen privaten Teil auf: Alle Spieler in derselben Zone teilen sich denselben öffentlichen Teil, sodass wir Verarbeitungszeit sparen, da sich herausstellte, dass die Serialisierung unter Java (nicht unter JavaScript) ein Engpass ist.
Hendrik Brummermann
quelle
Ah ha! Stellt die Aktionen für eine Schleife in eine Warteschlange, anstatt sie zur Anrufzeit zu verarbeiten, genau das, was ich brauchte!
MetaGuru
3

Verwenden Sie socket.io , eine praktische WebSockets-Abstraktionsbibliothek, die Fallbacks für Browser bietet, die dies nicht unterstützen.

Wenn Sie sich für ein solches Online-Modell entscheiden, würde ich empfehlen, die Spielverarbeitung auf den Server zu verschieben. Auf diese Weise müssen Sie nur grafische Änderungen und Maus- / Tastatureingaben kommunizieren. Es hilft auch einiges, um Betrug zu verhindern.

Stephen Belanger
quelle