Suggerimenti per la comunicazione tra il browser JS e il server node.js? [chiuso]


7

Sto armeggiando con un semplice gioco di volantini sulle caverne basato su Canvas e vorrei farlo alla fine multiplayer. Il piano è utilizzare Node.js sul lato server.

I dati inviati consistono nella posizione di ciascun giocatore, direzione, velocità e simili. I movimenti del giocatore sono semplici forze fisiche, quindi dovrei essere in grado di estrapolare i movimenti prima del prossimo aggiornamento dal server.

Qualche suggerimento o best practice sul lato delle comunicazioni? Immagino che i socket web siano la strada da percorrere. Devo inviare informazioni in ogni passaggio del ciclo di gioco o con intervalli specificati? Inoltre, non mi importa se non funziona con i browser più vecchi.

Risposte:


10

Di recente ho creato un crossover di guerre di asteroidi / geometria con Node.js / JavaScript:
http://github.com/BonsaiDen/NodeGame-Shooter

Ha un server fat che elabora il gioco e thin client che sono fondamentalmente solo visualizzazioni. Il client fa alcune interpolazioni e cose per renderlo liscio.

Potresti voler esaminare questi due file, che contengono la logica di rete sottostante, nonché i modelli di attore e client:
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/client/nodegame.client. js
http://github.com/BonsaiDen/NodeGame-Shooter/blob/master/server/nodegame.js

L'intero gioco è basato su attori che gestiscono i loro "eventi di aggiornamento" (le cose che vengono inviate ai clienti) da soli, per la maggior parte. È anche possibile nascondere attori da un cliente specifico per implementare, ad esempio, l'invisibilità.

Si possono anche registrare giochi e semplicemente inserire i messaggi nel client per riprodurli.

Per quanto riguarda la tecnologia: i
WebSocket sono la strada da percorrere qui. Ho anche fatto una codifica binaria personalizzata per JS che, pur rinunciando a cose come più di 2 decimali sui float, è circa il 50% più piccola di JSON (ed è 2 volte più veloce sotto V8 rispetto alla codifica JSON nativa )


Grazie! Che NodeGame Shooter sia piuttosto interessante, dovrò passare un po 'di tempo con il suo codice.
Petteri Hietavirta,

8

Suggerirei di separare le cose.

In Stendhal che è un MORPG 2D scritto in Java, abbiamo fatto le seguenti cose e funziona abbastanza bene:

  • Il client utilizza un ciclo rapido per il disegno. Fa un'animazione fluida e alcune previsioni per ridurre al minimo il ritardo.
  • Il server utilizza un loop per elaborare tutta la logica del gioco. Nel nostro caso può essere molto più lento del loop di disegno. Mentre i client fanno alcune previsioni, il server vince sempre.

La comunicazione tra client e server avviene tramite azioni e percezioni:

  • Le azioni eseguite dagli utenti come "sposta su" vengono inviate al server quando si verificano. Il server li mette in coda e li elabora nel proprio ciclo.
  • Le percezioni vengono inviate dal server al client per aggiornare la loro visione del mondo.

Abbiamo fatto alcuni "trucchi" per ottenere prestazioni aggiuntive:

  • Abbiamo due tipi di messaggi di percezione: uno completo utilizzato per l'accesso e i giocatori che si uniscono a una zona. E gli aggiornamenti incrementali utilizzati successivamente. Ciò consente di risparmiare molta larghezza di banda della rete.
  • Dividiamo i messaggi di percezione in una parte pubblica e una privata: tutti i giocatori nella stessa zona condividono la stessa parte pubblica, quindi risparmiamo tempo di elaborazione perché la serializzazione si è rivelata un collo di bottiglia su Java (non JavaScript).

Ah ah! Metti in coda le azioni per un ciclo anziché elaborarle al momento della chiamata, proprio quello di cui avevo bisogno!
MetaGuru,

3

Usa socket.io , è una pratica libreria di astrazione WebSocket che fornisce fallback per i browser che non lo supportano.

Inoltre, se stai cercando un modello online del genere, consiglierei di spostare l'elaborazione del gioco sul server. In questo modo devi solo comunicare cambiamenti grafici e input da mouse / tastiera. Aiuta anche un po 'a prevenire gli imbrogli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.