Sto implementando un server di gioco che supporta mischia simile a Star Control . Quindi hai navi che volano e sparano, con una fisica di velocità / accelerazione / smorzamento super semplice per guidare il movimento.
Ho letto Valve, Gafferon e Gambetta e implementato l'algoritmo di Gambetta per la previsione del cliente:
La previsione del client funziona sulla nave del giocatore aggiornando la sua posizione dal server come viene e quindi riapplicando l'input non ancora elaborato dal server alla nave del giocatore.
Sfortunatamente, non funziona bene per il mio gioco. Credo che abbia a che fare con il fatto che l'esempio di Gambetta non tiene conto degli oggetti che sono già in movimento o dei comandi che vengono aggiornati passo dopo passo. (per "passo" intendo frame). Quindi nel mio gioco il giocatore preme verso l'alto per accelerare la nave (già in movimento), che continua a spostarsi sul client, invia il comando al server e di solito riceve l'istantanea mondiale dal server al passaggio successivo. Ricevo qualcosa di più simile a:
Il comando player viene eseguito al passaggio 3 del client , ma sul server viene eseguito solo al passaggio 5 del server . Quando l'istantanea mondiale viene ricevuta dal cliente al passaggio 6 del cliente , la previsione è molto lontana, specialmente a velocità più elevate.
Il punto cruciale del problema è che il client esegue il comando al passaggio 5 , ma il server lo esegue al passaggio 6 . Ho pensato forse di inviare il passaggio client con il comando e fare in modo che il server esegua il rollback ed esegua nuovamente il comando con il passaggio temporale client. Ciò potrebbe comportare una serie di altri problemi, ad esempio ciò che accade ai comandi ricevuti dal rollback o il modo in cui i client truffatori possono sfruttare modificando il passaggio inviato.
La lettura e la visione di video come questo da Google menziona un approccio diverso, in cui si cambia gradualmente la posizione del giocatore in modo che corrisponda a quella dell'istantanea in pochi passaggi.
Le mie domande:
Riesci a far funzionare l'algoritmo di Gambetta con un movimento costante del passo? O è concettualmente incompatibile con il mio gioco?
L'interpolazione graduale su gradini è quindi la strada giusta da percorrere? In tal caso, come si interpola un oggetto già in movimento dalla posizione del client in modo che corrisponda a quello appena ricevuto dal server?
Questi metodi, l'interpolazione graduale e l'algoritmo di Gambetta possono funzionare in tandem o si escludono a vicenda?