Timestep nel gioco multiplayer


8

Sto cercando di avvolgere il mio cervello attorno al concetto di creare un'esperienza multiplayer server / client.

Il mio problema è principalmente legato al timestep. Considera il seguente scenario:

Un client si connette a un server. Il client invia i suoi input al server per indicare che vuole spostarsi. Il server simula l'input e determina la posizione di quel client nel mondo di gioco.

Poiché il client e il server sono entrambi in esecuzione su timestep diversi, come si simula con precisione in modo che tutti i client siano sincronizzati con il server? Il mio server è attualmente impostato su 30ms timestep. Quando elaboro i movimenti dei client, ci sono potenzialmente centinaia di richieste in attesa di essere elaborate, ma non c'è modo di indicare il tempo impiegato tra ciascuna delle richieste.

Non sto davvero capendo come simulare correttamente sul server in base al tempo, al fine di avere tutto sincronizzato.



3
Puoi provare anche questi link: Fast Gacing Multiplayer su Games-Networking
AshenBee,

Risposte:


3

In poche parole, è necessario inviare un timestamp con ogni istantanea dal server e con ogni input dal client.

Ad entrambe le estremità è necessario un processo per "compilare" tutti i frame in cui i pacchetti non vengono ricevuti.

Nel mio gioco (un gioco d'azione frenetico - il tuo potrebbe essere diverso), sul server, scarto qualsiasi input "vecchio" (fuori ordine), e suppongo semplicemente che se non arrivano nuovi pacchetti di input, gli stessi pulsanti continua a essere tenuto premuto (c'è un po 'più di roba per assicurarti che vengano gestite le brevi pressioni / rilasci dei pulsanti, ma questa è la premessa di base).

Sul client tengo un "buffer di ritardo" (descritto in questo articolo che Tetrad ha collegato). Uso una media mobile dei tempi di arrivo per garantire che il buffer di ritardo rimanga della giusta lunghezza, facendo funzionare il gioco client un po 'più lentamente o più velocemente per recuperare. Se le istantanee non arrivano in tempo, allora faccio l'estrapolazione sul client. Altrimenti interpolo tra le istantanee nel buffer.

Il client è anche responsabile del tracciamento del tempo di andata e ritorno per gli input e dell'utilizzo per la previsione (il server restituisce il timestamp dell'input utilizzato per il calcolo di un determinato frame). Memorizza gli input per quel periodo di tempo, riproducendoli per portare la posizione del giocatore dalla posizione "vecchia" (nell'istantanea dal server) alla posizione "presente" prevista.

Fondamentalmente il server continua a funzionare a un frame rate fisso. Spetta ai client rimanere sincronizzati con il server.

Naturalmente, questa è solo una panoramica di alto livello. Ci sono molti dettagli chiacchieroni che devi capire quando lo implementi.


Se il server riceve 10 comandi di input da un client tra una fase temporale del server. Il server esegue i 10 comandi di input. Come facciamo a sapere per quanto tempo simulare ciascun comando di input? Che cosa succede se si riceve solo un comando di input, si simula il comando sull'intero intervallo di tempo della fase temporale?
Jgallant

1
@Jon La maggior parte dei giochi "d'azione" invia input come pulsante su / giù per ogni frame. Il server quindi utilizza solo il più recente stato ricevuto come lo Stato per quell'aggiornamento tick. I pacchetti abbandonati, in ritardo e fuori servizio vengono ignorati. (Almeno a livello base - potresti, ad esempio, aggiungere ulteriori informazioni sul sequenziamento in modo che uno stato su o giù molto breve non venga ignorato, anche se eliminato.) Questo è probabilmente ciò che dovresti fare per tutti gli input che hanno un timing associato . Le azioni basate sui comandi (ad es. "Sposta qui" in un RTS) generalmente non hanno una durata associata, quindi le eseguiresti semplicemente in ordine.
Andrew Russell,
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.