Interpolare tra due stati collegati in rete?


11

Ho molte entità sul lato client che sono simulate (le loro velocità vengono aggiunte alle loro posizioni in base al frame) e lascio che si facciano da soli la morte. Inviano aggiornamenti su dove sono stati visti l'ultima volta e le loro variazioni di velocità. Funziona benissimo e gli altri giocatori vedono questo lavoro trovare. Tuttavia, dopo un po 'questi giocatori iniziano a desincronizzarsi dopo qualche tempo. Ciò è dovuto alla latenza.

Mi piacerebbe sapere come posso interpolare tra gli stati in modo che appaiano nella posizione corretta. So dove l'ULTIMO giocatore è stato visto e la sua velocità attuale, ma l'interpolazione all'ultimo stato visto fa sì che il giocatore si muova effettivamente indietro. Non potevo usare la velocità per gli altri clienti e semplicemente "spostarli" nella direzione appropriata, ma penso che ciò causerebbe movimenti irregolari. Quali sono le alternative?

Risposte:


9

Per questo motivo, scoprirai che le simulazioni vengono spesso eseguite 1 o più frame prima di ciò che viene effettivamente visualizzato in un dato momento nel client. Quindi, in altre parole, ciò che rendi potrebbe in effetti essere il secondo ultimo fotogramma, non l'ultimo fotogramma.

Cerca in questo articolo tutte le occorrenze della parola "avanti" e penso che inizierai a ottenere l'immagine migliore di come avrei potuto spiegarlo sopra.


Ok, quindi stai insinuando che dovrei davvero rendere il giocatore com'erano 300 ms fa e interpolare verso il futuro? (In uno stato separato, quando arriva un nuovo stato; questo cambierebbe)
Vaughan Hilts,

@VaughanHilts Ancora, leggi l'articolo e i commenti. Gaffer è un esperto in quel campo e lo spiega molto più chiaramente di quanto io possa. Ma l'idea generale è che sì, il tuo modello di simulazione è in anticipo mentre il rendering è in qualche modo indietro per tenere conto dell'effetto che hai descritto. Non è affatto l'unico posto in cui ho visto questa tecnica descritta.
Ingegnere

2

Quando dici:

questi giocatori iniziano a desincronizzarsi dopo qualche tempo

mi fa pensare che il tuo problema potrebbe avere più a che fare con il fatto che i tuoi orologi si allontanino dal passo che con eventuali problemi di latenza. Se è latenza, dovrebbe essere altrettanto brutto all'inizio di 10 minuti. Se un clock di gioco sta andando leggermente più veloce dell'altro, ci saranno alcuni strani artefatti che peggioreranno nel tempo. Un client potrebbe simulare in futuro, quando i pacchetti attuali arrivano dal server, tirerà indietro il client, facendo saltare le entità. Esegui altri test per scoprirlo.

Se i clock di gioco non sincronizzati sono davvero un problema, dovrai guardare molto attentamente il tuo ciclo di aggiornamento e assicurarti che ogni aggiornamento si basi sulla quantità di tempo di gioco trascorso (fisso o variabile) e che il gioco -time è avanzato usando qualcosa come l'orologio da parete (non il tempo di rendering o altre variabili). Gaffer ha alcuni buoni articoli su questo, e qui c'è una domanda decente che parla di timestep fissi vs variabili . Spero che questo ti aiuti.


Questo non è il caso, il caso è in effetti il ​​fatto che io faccia un conto troppo lungo (un picco di ritardo o qualcosa del genere - il pacchetto da "fermare" non viene ricevuto in tempo e il cliente non può correggersi in tempo. Lo so con certezza il caso perché dopo che il cliente si è fermato posso quasi sicuramente DEPINTELAY interpolare di nuovo in posizione.
Vaughan Hilts il
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.