"Noi incoraggiamo gli individui, consapevolmente curiosi, a passare dalla complessità alla semplicità, dall'interno all'esterno e, a metà strada fra la ricerca e la negazione del significato, vogliamo che i curiosi facciano una dannata scelta". Wachowski

mercoledì 25 settembre 2013

NET CODE: (pt.4) LA POSIZIONE DEGLI AVVERSARI

Nei primi post, abbiamo capito che il server controlla il nostro stesso movimento. Abbiamo capito che, però, il nostro client non può aspettare le conferme dal server delle nostre posizioni, così, il client, deliberatamente sceglie di predire il risultato del server, mostrandocelo subito in video.
Abbiamo capito che il nostro video, perciò, è qualcosa nel futuro che il server,e quindi gli altri client, riceveranno dopo.
Come si fa a giocare così? con un sistema che ha un metodo di computazione in ritardo e un video, che pur rappresentando il nostro presente, viene considerato come futuro?
Presi da queste domande abbiamo iniziato ad approcciare con il nostro lag, provando a sparare contro un riparo la cui distruzione sembra essere gestita dal server.
Adesso la domanda:
Come fanno gli altri giocatori ad essere mostrati sul nostro schermo?

Un esperto di logica, e non di ingegneria, direbbe che se noi viviamo nel futuro, anche gli altri dovrebbero vivere nel NOSTRO futuro. (Vedremo poi l'implicazioni della parola NOSTRO.)

Vediamo perciò se un esperto di logica ha ragione oppure no.
Purtoppo questo post non avrà alcun video, perciò questo articolo potrebbe risultare un pò indigesto.
Ipotizziamo questa situazione.
Il giocatore qui sotto, chiamiamolo giocatore sfigato è fermo in questo punto in Bazar e sta camperando. Diciamo che ha un ritardo di 4 secondi con il server. Ha proprio una connessione sfigata.

Il giocatore qui sotto, chiamiamolo giocatore connessionato, stava correndo e ora sta per sbucare verso l'angolo che lo separa dal giocatore sfigato e vuole fare una bella kill. Questo giocatore ha un ritardo di soli 10 millisecondi. Che culo che ha. 


Le informazioni dello sfigato vanno al connessionato grazie al server e viceversa.
Dimentichiamo per un attimo della predizione che ogni client fa di se stesso.

Vedendo così i numeri, direi che è una lotta impari perchè il connessionato vedrà lo sfigato 400 volte prima.

Il connessionato, gira l’angolo e dopo 10 ms vede il giocatore.
Il server, dopo 10 ms, riceve l’informazione della posizione del connessionato che la rigira allo sfigato che, poverello per lui, la riceverà solo dopo 4 secondi.

Visto così, un sistema multiplayer è ingiocabile perchè vincerebbe sempre e comunque solo un connessionato.

Invece devono giocare tutti, pure quelli che hanno il macinino al posto di internet (ma sempre fino ad un certo punto).
Il sistema ha il dovere di aiutare lo sfigato. Ha il dovere di compensare il lag del suo manicino. Ma come?

Il sistema sa che il connessionato si sta muovento, che il suo lag è di soli 10 millisecondi e che lo sfigato ha un lag di 4 secondi.

L'idea è quella di anticipare la rappresentazione del connessionato nello schermo dello sfigato.
L’anticipo dovrebbe perciò essere pari al lag dello sfigato.

Perciò, sullo schermo dello sfigato, si vede una immagine del connessionato portata nel futuro dello sfigato. Con quanto spiegato pocanzi, lo sfigato riuscirebbe a vedere il connessionato, portandolo avanti nel tempo, quando ancora starebbe correndo come in figura. (esempio esagerato, ma calzante).



Il sistema, su per giù, funziona a questa maniera. Ogni volta che vedete qualcuno sullo schermo, non è la sua reale posizione, ma una posizione portata nel vostro futuro, una specie di fantasma. Questo vi permette di mirare e colpire a ciò che vedete in quel momento, senza dover mirare un pò prima o un pò dopo.
Se non si usasse questo criterio, vincerebbero solo i connessionati.

Quanto descritto porta il nome di estrapolazione (estrapolation). Estrapolo la posizione del giocatore a partire dall’ultimo stato conosciuto per portarla avanti nel tempo.
A parte l’assurdità dei 4 secondi contro 10 ms, il problema di questo è il fatto che l’estrapolazione è fatta linearmente o quasi.
Se un giocatore corre in una direzione, la sua estrapolazione della posizione che avrà tra 10 secondi sarà un semplice spazio = velocità x tempo.

E se durante questo tempo, il giocatore cambia direzione o torna indietro?

E’ evidente che il sistema bestemmia in sette lingue e, a quel punto, deve ricorreggere la posizione del giocatore laggone teletrasportandolo da qualche altra parte.
Occhio che questo meccanismo di portare gli altri giocatori nel futuro in mondo che coincidano con il nostro presente (estrapolation) non è come il muovere il nostro giocatore nel nostro presente predicendo la risposta del server (prediction).
Stiamo sempre parlando di presente ma con due presupposti completamente diversi e dai risvolti devastanti:
Nella prediction, il client sa il proprio passato e presente e deve predire il futuro.
Nella estrapolazione, il client conosce solo il passato e deve predire il futuro. Un passato che è distante dal presente tanto quanto il nostro lag, perciò con una possibilità di sbagliare tanto più alta quanto maggiore è il lag.
Questo non è il solo modo per far giocate tutti, laggoni e non. Nel sito della Valve è spiegato anche un meccanismo chiamato interpolazione, ma per un attimo lo vorrei evitare sia per non appesantire la discussione, sia perché ormai forse siamo tutti interessati a capire che cosa succede con proiettili o altro, ovvero quello che viene chiamata hit detection. Se può interessare, magari lo vediamo alla fine.

Al prossimo post, dove inizieremo a capire che fine fatto i proiettili del connessionato e quelli del laggone.

Nessun commento:

Posta un commento