2011-08-20 10 views
5

Sto lavorando a un progetto per imparare node.js e stavo cercando alcuni suggerimenti su come gestire la sincronizzazione dei dati utente in tempo reale .Design pattern suggerimenti per la sincronizzazione di dati utente multipli in un gioco online in tempo reale

Supponiamo di avere una mappa rettangolare 2D (circa 600x400), con un numero di giocatori che occupa posizioni x, y su quella mappa. Ogni utente può navigare con i tasti freccia e interagire con gli altri in qualche modo base. Dato che questo sarebbe riprodotto su HTTP, quale sarebbe il miglior schema di progettazione in termini di gestione e sincronizzazione dei dati dell'utente per offrire un'esperienza più fluida e fluida?

mi viene in mente diverse opzioni, ma apprezzerei un po 'di idee/chiarimenti:

  1. client invia i dati di posizione al server, il server distribuisce tutte le posizioni a tutti i clienti, schermo è reso con il risultato. Ripetere. Il lato negativo sarebbe che il lato client è in ritardo rispetto al tempo necessario per un round di dati, ma il lato positivo è che sono sincronizzati con tutti gli utenti.

  2. Il client esegue il rendering dove pensa che sia costantemente, invia i dati posizionali al server, il server distribuisce tutte le posizioni a tutti i client e quindi il rendering dello schermo dai dati del cliente viene corretto con i dati del server. Il lato positivo è una risposta più veloce, il lato negativo è una leggera perdita di sincronizzazione.

  3. Una combinazione dei due, ma invece di utilizzare (x, y) le coordinate usiamo un vettore di [precedente x/y e tempo, corrente x/ye tempo, suggerito x/y all'intervallo di tempo ] che può quindi essere utilizzato per tracciare percorsi proiettili che cambiano costantemente. Sembra che sarebbe difficile da implementare.

Eventuali indicazioni?

+0

utilizzare socket.io per la comunicazione – Alfred

risposta

5

La maggior parte dei giochi utilizza una qualche forma di calcolo della deadning http://en.wikipedia.org/wiki/Dead_reckoning che consente aggiornamenti ritardati distribuiti dal server ma conserva alcuni illusioni di aggiornamenti in tempo reale sul client.

L'opzione migliore è 3. Non è particolarmente complessa: basta tenere traccia di dove si aspetta che ogni attore si basi sui meccanismi del gioco e quando si riceve un aggiornamento dal server si mettono in riga i due stati nel tempo .

Se si trova il server che invia uno stato troppo lontano dallo stato assunto dal client (troppo deve essere definito), è possibile passare allo stato del server e accettare la discontinuità sul client.

+0

Sì, farei lo stesso. A seconda del formato di trasferimento dei dati, la discontinuità sarebbe raramente evidente. Per favore dimmi che stai usando i socket e non il polling ... – landons

+0

anche se stai usando socket.io ti stai affidando al polling per la maggior parte degli utenti, i websocket sono abilitati solo su una manciata di browser. –

+0

@ Ricardo: utilizzando Websockets (http://caniuse.com/websockets) e Eventi inviati dal server (http://caniuse.com/eventsource) sarà in grado di inviare dati alla maggior parte dei client senza polling: solo gli utenti di IE dovrà usare il polling. –

Problemi correlati