Previsione sul lato client è una tecnica utilizzata nei giochi multiplayer per ridurre (l'aspetto di) ritardo: la macchina di ciascun giocatore esegue la propria simulazione di ciò che dovrebbe accadere successivamente e quindi si sincronizza rapidamente con la versione degli eventi "ufficiale" del server. In questo articolo, vedremo perché vorremmo farlo in primo luogo.
Questa tecnica è diventata popolare quando i giochi in rete come Quake (il cui codice sorgente è disponibile su GitHub) hanno iniziato a spuntare. Le velocità di rete disponibili al momento non erano così veloci - specialmente per Internet - quindi tentare di mantenere tutti i giocatori sincronizzati perfettamente con il server ha dato risultati mediocri.
Per iniziare a spiegare il problema, capiamo da dove viene.
Ad un primo sguardo, il problema che la previsione lato client risolve non esiste!
Tutto è semplice: il giocatore muove il proprio personaggio e il gioco indica al server la nuova posizione; il server passa quindi questa nuova posizione agli altri giocatori, i cui clienti aggiornano la posizione del primo giocatore nel gioco. Questo è tutto.
Ma cosa succede se il giocatore modifica il gioco per farlo passare una posizione diversa al server?
Imbrogliare! Il server si fiderà della nuova posizione del giocatore di (39, 4)
, anche se il giocatore si trova a una certa distanza e aggiornerà di conseguenza gli altri client. L'imbroglione può quindi teletrasportarsi efficacemente, rendendo il gioco non riproducibile per gli altri giocatori.
Poiché l'imbroglio è così semplice, abbiamo bisogno di una nuova soluzione. Cosa succede se il server ha il controllo totale sullo stato del gioco?
Con il server autorevole versione del gioco, il flusso sarà simile a questo:
Qui, il client dice al server, "Voglio spostare il carattere a destra"; il server lo elabora e decide che questo significa che il personaggio dovrebbe essere presente (1, 0)
; il server dice poi a tutti i clienti dei giocatori che dovrebbe essere il personaggio del primo giocatore (1, 0)
; e tutti i giocatori vedono il personaggio spostarsi nella nuova posizione.
Problema risolto, giusto? Non del tutto…
Il problema del teletrasporto è stato per lo più evitato, ma è stato introdotto il problema della latenza. Il client deve attendere la risposta del server circa l'intenzione di spostarsi prima di visualizzare il movimento sul giocatore. Questo flusso di lavoro rende il gioco in ritardo con connessioni medie e quasi ingiocabile su quelle povere.
La previsione lato client perfeziona il modello precedente. Durante la fase in cui il client ha inviato l'intento ed è in attesa della risposta del server, visualizzerà il movimento predice accadrà:
Ciò evita la sensazione di ritardo rimuovendo il tempo di attesa tra l'ingresso del lettore e l'uscita visualizzata.
La simulazione che si verifica sul client dovrebbe avere lo stesso risultato della simulazione che si verifica sul server, ma ci sono delle eccezioni - ad esempio, se due giocatori tentano di spostarsi nello stesso punto in una volta, uno verrà forzato. Quando la risposta del server viene inviata al client, il client deve solo confermare che corrisponda alla propria previsione; in caso contrario, il client deve utilizzare la risposta del server come vera fonte di informazioni e scartare la previsione per correggere lo stato del client.
Spero che questo articolo ti aiuti a capire questa tecnica utile per i giochi di rete che devono evitare la maggior parte dei problemi di cheating evitando allo stesso tempo il lag.