2011-11-17 13 views
31

Sono interessato a creare un piccolo gioco multiplayer in tempo reale, utilizzando HTML5/JavaScript per il client e probabilmente Java per il software server.I WebSocket sono adatti per giochi multiplayer in tempo reale?

Ho esaminato un po 'i WebSockets, ma sembra che abbia avuto idee sbagliate su cosa siano realmente WebSockets. Inizialmente avevo pensato a WebSockets come il modo in cui JavaScript gestisce i socket TCP, così come sono usati in Java e in altri linguaggi, ma sembra che ci sia un intero processo di handshaking che deve aver luogo, e ogni trasmissione include molto overhead HTTP (e in In tal caso, i vantaggi rispetto all'Ajax non sembrano così eccitanti come a prima vista)?

Su un argomento correlato, ci sono alternative migliori a WebSockets per questo scopo (giochi multiplayer in tempo reale in JavaScript)?

+2

In realtà ogni trasmissione contiene solo due byte di sovraccarico. L'handshaking http si verifica solo quando si apre un nuovo websocket e si può mantenere aperto il web socket fintanto che il browser rimane su quella pagina. –

+1

Sì, lo sono. l'handshake HTTP viene eseguito una volta per aprire il socket. Quindi il sovraccarico è grande se si chiude il socket dopo un messaggio e insignificante se si mantiene aperto il socket per sempre. – Raynos

+0

Perché il processo di handshaking è così complicato? Da quello che ricordo, si deve leggere in una manciata di stringhe, l'ultima delle quali è un insieme [casuale?] Di caratteri che devono quindi essere codificati in base64 in qualche modo e inviati al client. Ho provato a scrivere da solo il codice di handshaking sul lato server, ma non ha funzionato (il processo di handshaking non è mai stato completato, quindi non sono mai stato in grado di inviare e recuperare i miei pacchetti). Ho raggiunto lo stesso risultato esatto quando utilizzavo un pacchetto Java che qualcun altro aveva scritto per fare la stessa cosa. – Josh1billion

risposta

32

WebSockets sono la soluzione migliore per i giochi multiplayer in tempo reale eseguiti in un browser web. Come indicato nei commenti, c'è una stretta di mano iniziale in cui la connessione HTTP viene aggiornata, ma una volta stabilita la connessione WebSockets offre il meccanismo di connessione a latenza più basso per la comunicazione bidirezionale tra un server e un client.

vi consiglio di guardare questo: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Dai un'occhiata alla:

L'unica soluzione sarebbe raw TCP utilizzare un plug-in che supporta alcuni tipi di oggetti TCPClient. Ti consiglierei di provare WebSockets.

È possibile trovare un numero di opzioni here. Basta cercare WebSockets all'interno della pagina.

Anche dare un'occhiata a WebRTC. A seconda dello scopo del gioco e se è necessario che il server gestisca lo stato del gioco, è possibile utilizzare questa tecnologia per le comunicazioni peer-to-peer. Potrebbe essere ancora necessaria una soluzione per gestire l'inserimento dei giocatori in gruppi: in questo caso WebSockets è la soluzione più veloce/migliore.

+2

Il link al video di Rob Hawkes è rotto, è lo stesso discorso? http://youtu.be/_t28OPQlZK4 –

+2

@JasonSperske - sì, grazie. Ho anche aggiornato gli esempi. – leggetter

7

I giochi multigiocatore richiedono che il server invii istantanee periodiche dello stato del mondo al client. Nel contesto di un'applicazione HTML/js del browser hai poche possibilità: polling, websocket o scrivere il tuo plugin per estendere le funzionalità del browser.

Il polling HTTP come BOSH o Bayeux è sofisticato ma introduce sovraccarico di rete e latenza. Il websocket è stato progettato per superare i loro limiti ed è decisamente più reattivo.

Le librerie, ad esempio cometd o socket io, forniscono un'astrazione del trasporto e risolvono i problemi di compatibilità del browser. Inoltre, consente di alternare i trasporti sottostanti e confrontare le prestazioni senza sforzo.

Ho codificato multiplayer arcade game con socket.io e la solita misura 2 ms di latenza con una ragnatela e circa 30 ms con xhr-polling su lan. È abbastanza per un gioco multiplayer.

Ti suggerisco di dare un'occhiata a nodejs e socket.io per poter condividere il codice tra il client e il server, prendi anche in prestito del codice multiplayer a [3].

0

Se stai pianificando di utilizzare JavaScript per il tuo gioco (come sei), allora WebSocket è la scelta migliore per te. E se vuoi supportare la versione precedente di Internet Explorer, pensa al sistema Signal R sviluppato da Microsoft. Stanno usando WebSocket sotto il cofano, ma hanno anche alcune opzioni di ripiego ... quindi il protocollo utilizzerà la migliore soluzione disponibile disponibile.

http://signalr.net/

+2

Socket.io ha anche fallback – JorgeGarza

6

io non sono sicuro se WebSockets sono ancora il miglior strumento per il networking un multiplayer in tempo reale in questi giorni (2017). WebRTC è una nuova tecnologia che offre il potenziale di prestazioni molto più elevate. E questi giorni, WebRTC è anche più facile lavorare con grazie alle seguenti librerie:

  • node-webrtc semplifica lato server di rete
  • webrtc-native che fornisce anche una biblioteca sul lato server, e potrebbe essere più veloce come il suo nome suggerisce
  • electron-webrtc fornisce un'implementazione che è una buona partita, se si desidera comprimere il vostro gioco utilizzando electron

In alternativa, se si vuole essere risparmiata i dettagli reali dell'implementazione della rete e stai cercando una libreria che fornisca un'interfaccia multiplayer di livello superiore, dai uno sguardo allo Lance.gg. (disclaimer: sono uno dei contributori).

+0

Se abbiamo bisogno di un server autorevole, per impedire ai giocatori di barare, WebRTC funziona? Come possiamo evitare di barare con WebRTC? – trusktr

+0

E, sembra che l'invio di dati binari sarebbe il più veloce. Le persone stanno (de) serializzando JSON con WebSockets. Non è così lento? Come possiamo creare una rete UDP autorevole nel web? – trusktr

0

In sostanza, si dispone di 3 opzioni, al momento della stesura di questo:

WebSockets

WebSockets è un protocollo di messaggistica leggero che utilizza il protocollo TCP, piuttosto che un'implementazione di JavaScript socket TCP, come si' ho notato Tuttavia, al di là dell'handshake iniziale, non ci sono intestazioni HTTP passate avanti e indietro oltre quel punto. Una volta stabilita la connessione, i dati passano liberamente, con un sovraccarico minimo.

lungo polling

lungo polling, in estrema sintesi, prevede il polling client al server per le nuove informazioni periodicamente con richieste HTTP. Questo è estremamente costoso in termini di CPU e larghezza di banda, poiché si invia una pesante nuova intestazione HTTP ogni volta. Questa è essenzialmente la tua unica opzione quando si tratta di browser più vecchi e le librerie come Socket.io utilizzano il polling lungo come fallback in questi casi.

WebRTC

Oltre a quanto già detto, WebRTC consente una comunicazione via UDP. UDP è stato a lungo utilizzato nei giochi multiplayer in ambienti non basati sul Web a causa del suo basso overhead (rispetto al TCP), bassa latenza e natura non bloccante.

TCP "garantisce" che ciascun pacchetto arriverà (salvo per errore di rete catastrofico) e che arriveranno sempre nell'ordine in cui sono stati inviati. Questo è ottimo per informazioni importanti come la registrazione di punteggi, hit, chat e così via.

UDP, d'altra parte, non ha tali garanzie. I pacchetti possono arrivare in qualsiasi ordine, o per niente. Questo è davvero utile quando si tratta di dati meno critici che vengono inviati ad alta frequenza, e deve arrivare il più rapidamente possibile, come le posizioni dei giocatori o gli input. Il motivo è che i flussi TCP sono bloccati se un singolo pacchetto viene ritardato durante il trasporto, con conseguenti grandi lacune negli aggiornamenti dello stato del gioco. Con UDP, puoi semplicemente ignorare i pacchetti che arrivano in ritardo (o non del tutto) e continuare con quello successivo che ricevi, creando un'esperienza più fluida per il giocatore.

Al momento della stesura di questo documento, i WebSocket sono probabilmente la soluzione migliore, anche se l'adozione di WebRTC si sta espandendo rapidamente, e potrebbe essere effettivamente preferibile al termine del gioco, quindi è una cosa da considerare.

Problemi correlati