Come si sincronizzano client e server quando si inviano le variazioni di velocità del lettore?


10

Sto implementando la previsione sul lato client. La maggior parte delle spiegazioni presuppone che il client invii messaggi come " Sposta il mio giocatore in alto di 1 posizione ". Cosa succede se invio messaggi come " Imposta la velocità del mio giocatore su x "?

grafica esplicativa;  mostrando i messaggi inviati e le posizioni calcolate sul client e sul server nel tempo

Sul client, il giocatore imposta la propria velocità (in base alla previsione sul lato client) prima che il server lo faccia, portando i due a non sincronizzarsi. Questo problema persiste anche considerando la latenza media.

Come posso affrontare questo?

Risposte:


8

È necessario inviare dati ridondanti, che qui significa inviare la posizione e la velocità. Anche se non sei sincronizzato, il fatto che tu abbia la posizione e la velocità ti consente di correggere la traiettoria usando una funzione di interpolazione.

Quindi l'utilizzo di alcuni trucchi come animazioni ritardate, accelerazioni, ecc. Consente di nascondere la latenza.

Modifica: presumo che il server sia autorevole.


Grazie per la tua risposta. Sì, il server è autorevole ma anche se invio dati ridondanti con la mia velocità, il client potrebbe correggere i suoi errori ma spesso leggo cose come "Se il client / server utilizza codice condiviso per le loro entità, gli errori di previsione non si verificheranno mai realmente" ma nel mio caso, si verificheranno SEMPRE leggermente, il che provocherebbe balbuzie dappertutto.
Blu3,

1
@utente13842 il client sarà sempre fuori sincrono, dovresti correggere la posizione e la velocità lato client, come ha detto Thelvyn, in base al server che ti invia. in questo modo non si ottiene il movimento di balbuzie a meno che il client non sia completamente fuori sincrono, quindi sarà necessario agganciare i valori perché la correzione richiederebbe troppo tempo.
dreta,

Questo è il motivo principale per utilizzare una funzione di interpolazione. Non puoi evitare la latenza, quindi devi correggere il movimento in modo regolare. Il client e il server simulano il mondo, ma il client deve ascoltare il server ed eseguire correzioni. Alcune tecniche utilizzate nelle reti del motore di origine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn

viene brevemente menzionato anche in questo discorso su Google, dovrebbe far venire l'idea su youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta

Ho trovato un'altra soluzione per questo particolare problema. Aggiungo il tempo in cui il client ha applicato i suoi input con ciascun pacchetto. Il significato n. 1 avrebbe tempo: 0 e la seconda volta: 100. Ora il server sa che il client ha premuto il suo pulsante alla volta: 100 e non prima.
Blu3,
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.