Come compensare gli oggetti in movimento con la previsione lato client?


11

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.

inserisci qui la descrizione dell'immagine

Ho letto Valve, Gafferon e Gambetta e implementato l'algoritmo di Gambetta per la previsione del cliente:

inserisci qui la descrizione dell'immagine

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:

inserisci qui la descrizione dell'immagine

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?


Ho fatto lo stesso e ho riscontrato lo stesso identico problema. Non appena ho aggiunto le velocità applicando lo stato del server e riapplicando gli input mi sono sbarazzato delle variazioni di velocità già gestite. Ho cercato di riapplicare tutti gli aggiornamenti dall'ultimo messaggio ricevuto, ma non è ancora molto semplice. Hai mai trovato una soluzione a questo?
MakuraYami,

@MakuraYami Sì, ho iniziato a scrivere un articolo che descrive la soluzione. Si aggiornerà presto!
OpherV,

Ho lavorato di più sul mio progetto e ho trovato una soluzione utilizzabile e alcune altre buone risorse parlando di questo problema. Sono interessato a discutere ulteriormente, confrontare soluzioni, ecc. Fammi sapere dove posso contattarti :)
MakuraYami

@makurayami il mio nome utente su Gmail
OpherV

Risposte:


5

Durante i 6 mesi da quando ho posto questa domanda, ho finito per sviluppare un server di gioco open source completo per affrontare questo problema esatto (e molti altri!): Http://lance.gg

inserisci qui la descrizione dell'immagine

La R&S coinvolta ora mi permette di rispondere alle mie domande:

  • Riesci a far funzionare l'algoritmo di Gambetta con un movimento costante del passo? O è concettualmente incompatibile con il mio gioco?

    L'algoritmo di Gambetta non funzionerà quando il movimento dell'entità non è deterministico (dal punto di vista del cliente). Se un'entità può essere influenzata senza input da parte della fisica o di altri giocatori, ad esempio deve essere adottato un approccio più elabroato.

  • 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?

    Questo tocca un argomento diverso, ovvero la riconciliazione client degli aggiornamenti del server. L' interpolazione graduale funziona, ma per giochi molto veloci come quello in questione è meglio implementare effettivamente l' estrapolazione

  • Questi metodi, l'interpolazione graduale e l'algoritmo di Gambetta possono funzionare in tandem o si escludono a vicenda?

    Possono lavorare insieme, ma solo se il movimento dell'entità è deterministico dal punto di vista del cliente. Quindi non funzionerà se l'entità è influenzata dalla fisica o dalla psico-fisica come l'inserimento, il trascinamento, ecc. "


1

Il tuo gioco sembra essere troppo "in tempo reale" per pensare in termini di fasi temporali. Penserei solo in termini di "turni" se il gioco può essere considerato "a turni". Altrimenti, abbandona l'idea di giri o gradini. Tutto diventa più facile allora :)

Nota che prevedi localmente per il tuo giocatore e interpoli solo per altre entità (come spiegato nel terzo articolo della serie). Il modo di gestire gli aggiornamenti del server per gli oggetti che erano già in movimento è la riconciliazione sul lato server, spiegata nella metà inferiore del secondo articolo (quello a cui si è collegati).

Spero che questo ti aiuti :)


Per chiarire, per "passo" intendo "frame", che viene eseguito 60 volte al secondo. Lo chiamo step (e non frame) per differenziare l'effettiva progressione del gioco dal rendering, e idealmente sono entrambi sincronizzati a 60 al secondo. Ho già implementato la tua versione della riconciliazione sul lato server che funziona alla grande. Questa domanda si riferisce solo alla nave del giocatore - che è in costante movimento indipendentemente dal comando del giocatore (a causa di inertion). Ecco dove sta la mia difficoltà. Qualche idea su questo? :)
OpherV,

I frame sono diversi dai passaggi. I passaggi si muovono in un ordine costante e prevedibile. I frame si spostano per un periodo di tempo variabile, quindi ogni progressione deve essere moltiplicata per il delta time per quel frame.
Tealr,

@Tealr in effetti, motivo per cui ho usato il termine "passaggio" per cominciare - Volevo solo chiarire che l'uso di "passaggio" non si limita ai giochi a turni, e nel mio gioco un passaggio richiede esattamente 1 / 60 di secondo indipendentemente dal rendering.
OpherV,

Solo qualcosa che noto per il mio esperimento: 1/60. è insolitamente veloce e scommetto che la maggior parte dei giochi online con più di una partecipazione 1x1 funzionano a 1/10. aggiornamenti o successivi.
Patrick Hughes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.