Tra i client JS e un server di gioco Unity: TCP o UDP?

3

Attualmente sto costruendo un gioco interattivo che ha un caso d'uso molto speciale: il gioco viene visualizzato su uno schermo gigante sul palco di un teatro, e il pubblico può suonarlo con i loro smartphone ( link )

I miei strumenti sono:

  1. Un'app desktop creata con Unity, visualizzata sullo stage
  2. Un server web (RoR) che fornisce l'app javascript ai membri del pubblico

Il gioco è:

  1. Puoi spostare un fireflie sullo schermo del tuo dispositivo mobile e vedere tutte le lucciole del pubblico sullo schermo dello stage.
  2. Questo è tutto. Voglio tenerlo per ora semplice

Per la mia dimostrazione del concetto, ho avuto la seguente architettura:

  1. Le app Web inviano le proprie posizioni al server web ogni 0,5 ms (è 500ms, mi dispiace)
  2. Il server Web memorizza e aggiorna tutte queste posizioni (in memoria, nessun database)
  3. L'app unity chiede al server web tutte le posizioni ogni 0,5ms (500ms, di nuovo) e aggiorna il gioco visualizzato sullo schermo del palco di conseguenza

Ha funzionato bene a prima vista, ma il mio piccolo server web era in ginocchio quando troppe persone giocavano nello stesso momento (il che è davvero sfortunato per il mio tipo di gioco).

Quindi, voglio ridisegnarlo in:

  1. Le app web inviano le proprie posizioni direttamente all'app Unity , non al server Web
  2. L'app unity è il vero server di gioco, memorizza e aggiorna le posizioni
  3. Sì, mi piacciono le liste.

Ora, ecco la mia domanda: comunicheresti con il protocollo TCP o UDP tra il JS nell'app web e il server di gioco unity?

Mi piacerebbe sapere i tuoi pensieri:)

[EDIT]: ho finito per creare un server websocket nel mio gioco di unità con github.com/sta/websocket-sharp. Funziona molto bene

    
posta Caillou 05.06.2017 - 14:12
fonte

1 risposta

4

UDP vs TCP

UDP è leggero, senza stato e con perdite.

TCP è pesante, ricco di stati e robusto.

UDP è il migliore quando gli errori di trasmissione possono essere ignorati. Il TCP è il migliore quando gli errori di trasmissione devono essere corretti. Voice over IP utilizza UDP a causa delle conversazioni vocali sensibili al tempo. È meglio ascoltare un singhiozzo e tornare in sincronia per chiedere un'altra copia di un pacchetto perso e finire in ritardo.

Nel tuo caso d'uso odio trovarmi accoltellato al telefono cercando di farlo muovere solo per vederlo sporadicamente mostrare i miei movimenti più tardi in uno scoppio. Stai al passo con me.

Frequenza

Ogni 0,5 ms (una variabile di sintonizzazione) è 2000Hz e francamente più veloce della maggior parte dei monitor frequenza di aggiornamento 60Hz-120Hz. La regolazione di questo potrebbe risolvere alcuni dei tuoi problemi. Dovrebbe permetterti di avere circa 20 volte le persone connesse prima che si manifesti lo stesso problema. Scrivi il tuo software in modo che questo numero sia deciso in un'unica posizione in modo da poterlo regolare facilmente per sperimentare le tue reali esigenze.

Se vuoi avere un impatto maggiore di solo 20 volte più grande, pensa di ridurre il sovraccarico. Invece di trasmettere continuamente un pacchetto xey, prova a trasmettere alcuni di essi in un burst. La durata della raffica si aggiungerà al tuo ritardo ma sarà coerente. Abbastanza piccolo e sarà appena percettibile.

Questa idea funzionerebbe bene con il buffering del frame. Piuttosto, basta avere un fotogramma in fase di rendering in un momento in cui i videogiochi lavorano sul rendering di più di essi alla volta e li fanno consumare in ordine. Se hai 10 fotogrammi in memoria e un pacchetto arriva con 10 posizioni campionati, li rendi ciascuno nei loro frame bufferizzati.

Fare tutto questo porta la tua velocità .5ms a 0.1 secondi e significa che il tuo pubblico può essere 200 volte più grande. Questo potrebbe non essere il ritardo accettabile per alcuni videogiochi, ma dovrebbe funzionare bene per lucciole.

Alcune persone potrebbero essere connesse, ma in realtà non stanno spostando la loro lucciola al momento. Alcuni risparmi inaffidabili possono essere ottenuti mantenendo i loro smartphone in silenzio fino a quando non hanno qualcosa di utile da dire.

UI

Il tuo gioco di lucciole mi ricorda di un mago che rompe i baffi dove hanno cercato di bruciare una nave avendo una folla in attesa di specchi al sole. Il problema più grosso che avevano era nessuno poteva dire di chi fosse il riflesso. Ciò significava che non potevano concentrarsi perché non potevano sapere se avevano bisogno di spostarsi su, giù, a sinistra o a destra per essere sul bersaglio.

Considera la possibilità di distribuire gruppi di colori. Se sono un punto verde tra centinaia non ho alcuna speranza di seguire il mio punto. Se sono uno dei dieci punti rossi, ho una possibilità anche se ci sono altri 90 colori che rimbalzano. Supponendo che non sono daltonico (rosso / verde è il più comune). Buone scelte di colore dovrebbero essere in grado di minimizzare questo impatto.

Direttamente all'app Unity

In pratica stai facendo un server quando lo fai. Avrai bisogno di ascoltare su una porta per consentire agli utenti di connettersi.

Ricordati di pulire la vecchia posizione prima di spostarli in una nuova posizione se li tieni sullo schermo anche dopo che hanno interrotto la trasmissione per il momento. Se fai di nuovo il tuo stato e devi ricordarti di continuare a disegnarli sul posto fino al loro timeout. Un modo per gestirli è far sì che mantengano il loro stato e trasmettano dove erano prima, quindi puoi utilizzarlo per ripulire la vecchia posizione.

Oppure puoi pescare solo quando ti viene detto di disegnare. Questo è più semplice, ma ora la perdita di pacchetti si trasforma in sfarfallio della lucciola.

    
risposta data 05.06.2017 - 15:30
fonte

Leggi altre domande sui tag