Sto lavorando su uno sparatutto 2D top-down e sto facendo del mio meglio per copiare concetti usati in giochi in rete come Quake 3.
- Ho un server autorevole.
- Il server invia snapshot ai client.
- Le istantanee contengono un timestamp e posizioni entità.
- Le entità sono interpolate tra le posizioni dell'istantanea in modo che il movimento appaia regolare.
- Per necessità, l'interpolazione di entità si verifica leggermente "in passato" in modo da avere più istantanee tra cui interpolare.
Il problema che sto affrontando è "sincronizzazione dell'orologio".
- Per semplicità, supponiamo solo per un momento che non ci sia latenza zero durante il trasferimento di pacchetti da e verso il server.
- Se l'orologio del server è 60 secondi avanti rispetto all'orologio del client, un timestamp dell'istantanea sarà 60000ms prima del timestamp locale del client.
- Pertanto, le istantanee delle entità verranno raccolte e rimarranno attive per circa 60 secondi prima che il client veda una determinata entità fare le sue mosse, poiché il clock del client impiega così tanto tempo a recuperare il ritardo.
Sono riuscito a ovviare a questo problema calcolando la differenza tra l'orologio del server e quello del client ogni volta che viene ricevuta un'istantanea.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Nel determinare la distanza dell'interpolazione dall'entità, aggiungo semplicemente la differenza all'ora corrente del cliente. Il problema con questo, tuttavia, è che causerà scossoni perché la differenza tra i due orologi fluttuerà bruscamente a causa di istantanee che arrivano più velocemente / più lentamente degli altri.
Come posso sincronizzare gli orologi abbastanza strettamente che l'unico ritardo percepibile è quello che è hardcoded per l'interpolazione e quello che è causato dalla normale latenza di rete?
In altre parole, come posso impedire che l'interpolazione inizi troppo tardi o troppo presto quando gli orologi sono significativamente desincronizzati, senza introdurre scatti?
Modifica: Secondo Wikipedia , NTP può essere utilizzato per sincronizzare gli orologi su Internet entro pochi millisecondi. Tuttavia, il protocollo sembra complicato e forse eccessivo per l'uso nei giochi?