2011-01-17 9 views
5

Sto scrivendo un semplice gioco pong online per due giocatori che giocano in rete. È un'applicazione client-server, con una logica di gioco sul lato server. Ho alcuni problemi con la sincronizzazione dei giochi sul lato client, e il risultato è piuttosto insoddisfacente. Ecco come funziona attualmente:Sincronizzazione semplice della rete di gioco pong online

  1. Sul lato server, ho un oggetto di gioco che memorizza la posizione dei giocatori e della palla, ogni oggetto ha la sua posizione x, y e velocità x, y. Basato su quella posizione degli oggetti viene aggiornato nel ciclo. Sul lato client c'è lo stesso oggetto locale con gli stessi dati, e viene anche aggiornato nel ciclo.
  2. Quando il giocatore preme/rilascia su o giù il client invia un pacchetto di rete con un numero intero, in modo che l'oggetto giocatore si avvii/si arresti per spostarsi nell'oggetto di gioco sul server.
  3. Il server invia un pacchetto di sincronizzazione ogni 50 millisecondi con posizione e velocità di tutti e tre gli oggetti. Quando il client riceve questo pacchetto cambia di conseguenza le posizioni degli oggetti del gioco.

Questo metodo non funziona molto bene poiché sposta gli oggetti del gioco avanti e indietro sul lato client. Qualche idea su come migliorarlo?

+0

Cosa intendete per "risultati insoddisfacenti" e "spostamento degli oggetti avanti e indietro"? – BlueCookie

+0

Questo articolo è apparso dopo questa domanda: http://drewblaisdell.com/writing/game-networking-techniques-explained-with-pong/ – opyate

risposta

17

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.

Problemi correlati