Ammetti di avere una latenza di 30 ms tra client e server. Il client invia "Voglio spostare la racchetta verso il basso" e la sua racchetta è nella posizione y = 100px con una velocità di 0.1px/ms
30ms secondi più tardi:
- cliente racchetta è nella posizione y = 100 + 30 * 0.1 = server di 103px
- riceve l'ordine dal client e iniziare a muoversi la racchetta (che è attualmente ancora ay = 100px sul lato server)
20ms secondi:
- client racchetta è nella posizione y = 103 + 20 * 0,1 = 105px
- lato server client racchetta è nella posizione y = 100 + 20 * 0,1 = 102px
- server invia al client la nuova posizione (102px)
30ms secondi:
- client rarcket è nella posizione y = 105 + 30 * 0,1 = 108px
- client riceve dal server nuovo positon della racchetta : 102px
A questo punto, la racchetta cliente "salta" a ritroso da 108 a 102px ...
come affrontare la latenza di rete? Due complementari modi:
- attendono acknowlegment del server prima di fare un'azione
- predire i risultati delle azioni (ai lati client e server)
Il primo aproach viene utilizzato quando l'effetto sulla il cliente è difficilmente collegato al risultato e non può essere "rollback". Esempio: quando un cliente lancia un missile, non è un fatto che questo missile venga soppresso dal server al prossimo aggiornamento perché il client non ha in effetti più scorte di missili. In questo caso, l'applicazione client avvierà il missile solo dopo che il server ha inviato un acknowlegment.
Il secondo viene sempre utilizzato per evitare questi "salti" durante la sincronizzazione del server. Devi monitorare la latenza della rete per prevedere il movimento dei tuoi elementi di gioco. Ecco due modi: calcolare il ping o sincronizzare l'ora del server e del client all'avvio (il modo più semplice e più affidabile). L'idea generale è:
- client invia "Voglio spostare la racchetta verso il basso al momento = 1.265.871" e iniziare a muoversi
30ms dopo: racchetta
- cliente al y = 100 + 30 * 0.1 = 103px
- server riceve lo spostamento e calcola la latenza di 30 ms (tramite ping o differenza di sincronizzazione dell'ora) e imposta la posizione della racchetta su y = 100 + latenza * 0.1 = 100 + 30 * 0.1 = 103px
Perfetto! Sono sincronizzati.
20ms successive:
- server e client racchetta sia a y = 103 + 20 * 0,1 = 105px
- server invia nuova posizione e direzione
30ms successive:
- racchetta client a y = 105 + 30 * 0,1 = 108px
- client r eceives nuova posizione e la direzione (105px movimento verso il basso), calcola la latenza 30ms e impostare la posizione racchetta y = 105 + latenza * 0.1 = 105 * 30 * 0,1 = 108px
Ancora, client e il server sono sincronizzati!
Desync può verificarsi sull'altro client quando il primo client smette di spostarsi. In questo caso la racchetta del giocatore "salterà" un po '. Quando questo non è critico, è possibile attenuare questa transizione.
Spero che possa essere d'aiuto.
Cosa intendete per "risultati insoddisfacenti" e "spostamento degli oggetti avanti e indietro"? – BlueCookie
Questo articolo è apparso dopo questa domanda: http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate