2013-03-05 16 views
7

Ho due timer per il conto alla rovescia JavaScript (per un gioco) e una tabella MySQL per ricevere dati dalle chiamate AJAX da uno dei due.Sincronizza due timer JavaScript lato client con il server

Il processo è il seguente:

  1. un cliente avvia il timer, scrive è data1 colonna di MySQL in modo che è iniziato il timer, ed una colonna time1 con l'attuale timestamp (con precisione .01s , dalla chiamata PHP come MySQL non non farlo)

  2. l'altro client (polling del server a intervalli 2S) rileva la modifica e avvia un timer, ma sottrae subito (si tratta di un conto alla rovescia) 0.123.dove ctime è la data/ora della seconda chiamata client (fornita anche da PHP) e time1 è la data/ora che il primo client ha scritto quando ha avviato il timer.

Questo metodo dovrebbe eliminare il ritardo causato dai 2s intervalli di polling, ma a prescindere se lo fa o no (io non sono davvero sicuro di essere onesti), la sincronizzazione tra i timer varia . A volte sono esatti, a volte possono durare fino a 3 secondi. (E 'inaffidabile.)

Ecco alcuni dei miei relativo codice che sto usando:

var timerRunning, timeRemaining, responseTime; 

function restartLocalTimer() { 
    var d = new Date(); 
    responseTime = d.getTime()/1000; 
    timerRunning = true; 
    timerTick(); 
} 

function restartSyncTimer(resp) { // resp is the AJAX response passed 
    var d = new Date(); 
    responseTime = d.getTime()/1000 - parseFloat(resp["ctime"]) + parseFloat(resp["time"]); 
    timerRunning = true; 
    timerTick(); 
} 

function timerTick() { 
    d = new Date(); 
    timeRemaining = 20 - d.getTime()/1000 + responseTime; 
    if (timerRunning) setTimeout("timerTick()",25); 
} 

Tutti i valori di tempo sono in secondi. (A causa del database, potrebbe passare a ms in seguito.)

Le mie domande sono: Ci sono eventuali ritardi (significativi) che non sto tenendo in considerazione? C'è un modo migliore per farlo?

Nota: sono aperto a jQuery (lo utilizzo già per le chiamate AJAX), ma non voglio utilizzare websockets.

+1

Ok, quindi l'ho letto questa volta. Prima di tutto: perché usare 'setTimeout (" timerTick() ", 25)'? Perché no 'setTimeout (timerTick, 25)'. Il primo argomento di 'setTimeout' prende un handle di funzione. In secondo luogo: che cosa succede se utilizzi ad esempio la pagina Timeline o Rete di Google Chrome nella console, ciò ti aiuta a identificare ciò che causa il ritardo, o l'hai già provato? –

+0

ok, la prima cosa è praticamente solo estetica, ma grazie comunque. per quanto riguarda la timeline, ho intenzione di guardare più in quello. –

+0

'resp [" time "]' è il timestamp a cui stai eseguendo il conto alla rovescia? – Bergi

risposta

1

Prenderei lo stesso approccio che i giochi multiplayer di rete desktop richiedono. Anche durante brevi momenti di interruzione della connessione (ad es. "Lag"), il cliente proietta le traiettorie previste in quel momento. In questo caso, ci si basa su un intervallo locale e si aggiorna con l'ora esatta del server quando si ottiene la risposta sincrona del battito cardiaco.

-1

setTimeout e i suoi fratelli sono noti per essere inaffidabili. C'è un altro post su questo: Is there a more accurate way to create a Javascript timer than setTimeout? che fornisce alcuni suggerimenti.

+0

avviso che setTimeout esegue solo la funzione periodicamente, ma non calcola i calcoli relativi al tempo. ciò avviene tramite la data –

+2

È perché non penso che tu abbia letto il mio codice, visto solo il setTimeout() e fatto immediatamente delle ipotesi. Non è così che scrivi una risposta. Un commento, forse. –

+0

Hai ragione, ha risposto troppo velocemente. Mi è piaciuta la scorsa settimana, quindi ho concluso troppo in fretta questo era lo stesso. –

Problemi correlati