Principi di progettazione del gioco multiplayer in tempo reale per Node.js


12

Ho letto l' articolo Valve sul networking multi-player che è stato adattato dall'articolo del 2001 di Yahn Bernier chiamato Metodi di compensazione della latenza nella progettazione e ottimizzazione del protocollo in-game client / server . Sto realizzando un gioco multigiocatore in tempo reale utilizzando un server node.js collegato ai client tramite socket.io e ho alcune domande relative ai principi dettagliati di seguito:

Interpolazione entità

[Interpolazione] impedisce il movimento nervoso che ciò porterebbe normalmente a buffering degli aggiornamenti del server per poi riprodurli con gli spazi uniformemente interpolati tra. Può anche proteggere dai problemi causati dalla perdita di pacchetti.

Previsione lato client

La previsione è la nozione del client che prevede gli effetti delle azioni del giocatore locale senza attendere che il server li confermi. Lo stato previsto di un'entità viene testato rispetto ai comandi del server quando arrivano fino a quando non viene rilevata una corrispondenza o una mancata corrispondenza.

Compensazione del ritardo

La compensazione del ritardo è la nozione del server che utilizza la latenza di un giocatore per riavvolgere il tempo durante l'elaborazione di [input utente], al fine di vedere cosa ha visto il giocatore quando è stato inviato il comando. In combinazione con la previsione, la compensazione del ritardo può aiutare a combattere la latenza della rete al punto da eliminarla quasi dal punto di vista di un attaccante.

  • I principi si applicano a TCP come fanno a UDP e ci sarebbero differenze nell'implementazione? Vedo che l'interpolazione di entità non avrebbe bisogno di protezione dalla perdita di pacchetti, ma questo è tutto.

  • Posso persino comunicare tra un server e un browser Web e viceversa utilizzando UDP e Node.js?

  • Poiché il documento ha più di un decennio, questi principi sono ancora in uso o sono apparse altre tecnologie?

Qualsiasi aiuto sarebbe molto apprezzato.


1
In realtà non hai bisogno di UDP per i giochi multiplayer, contrariamente alla credenza popolare. Impara dai migliori; WoW utilizza TCP e credo che molti altri giochi multiplayer AAA lo facciano. Le persone seguono solo i consigli di qualcuno e poi trascorrono i prossimi 5 mesi implementando una versione cattiva e lenta di TCP stessi!
jcora,

1
(A meno che, naturalmente, non si abbia la certezza di disporre delle conoscenze e delle risorse per sviluppare un protocollo decente su UDP in grado di sfruttare i suoi vantaggi.)
jcora,

1
Nessun gioco AAA FPS utilizza TCP. È davvero troppo lento per i giochi che richiedono un aggiornamento in tempo reale. Ma dal momento che non sta scrivendo un gioco d'azione, dovrebbe essere in grado di cavarsela con TCP.
Brendan Lesniak,

@Yannbane Non sapevo che WoW utilizza TCP. Sembra che facciano molti MMO, da quello che ho potuto trovare. Mi rende molto più sicuro di scrivere giochi multiplayer con HTML5. Grazie!
dreta,

Risposte:


6
  • I principi per ridurre gli effetti dei ritardi sono gli stessi indipendentemente dal protocollo di trasporto. La perdita di pacchetti è un altro argomento - per molti tipi di pacchetti la perdita di alcuni non è fondamentale perché il prossimo aggiornamento è probabilmente già in corso - qui UPD ha il vantaggio, ma quando è necessario assicurarsi che un determinato pacchetto sia consegnato, è necessario un servizio personalizzato codice di riconoscimento per farlo con UDP
  • Node.js supporta UDP, ma i browser Web no (senza plugin). Il miglior metodo in tempo reale per comunicare tra i due è Web Socket, che è fondamentalmente TCP. Ma per la comunicazione, potresti voler usare Socket.IO, che fornisce fallback per i browser che non supportano i socket web.
  • I principi rimangono gli stessi.

1
Immagino che questo sia obsoleto - WebRTC dovrebbe essere il modo di usare una comunicazione simile a UDP, non è vero?
Nikolay Tsenkov,

4

Dai un'occhiata a questo articolo sui giochi multiplayer in tempo reale in HTML5 pubblicato sul sito buildnewgames.com da Sven Bergstrom, parla delle stesse cose e usa Node.JS. Ho qualcosa di simile da solo. Sto solo studiando di più sulla previsione e l'interpolazione lato client e simili prima di provare ad affrontare il resto.

Credo che sia sicuramente possibile farlo con Socket.IO e Node, tuttavia la tecnologia è ancora nuova, quindi ci sarà poca documentazione e poco o nulla in termini di guide sull'implementazione. Consiglierei di fare quello che sto facendo e di studiare la materia in modo molto dettagliato in termini astratti di alto livello e quindi provare a implementarla da solo.


1

Credo che la tecnologia sia praticamente la stessa. Inoltre, i concetti non dipendono dal linguaggio che usi o se usi UDP o TCP. Ho scritto una spiegazione molto dettagliata di tutto qui http://www.gabrielgambetta.com/fpm1.html , inclusi diagrammi carini :)

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.