"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

lunedì 18 novembre 2013

NET CODE: (pt.8) FATTORE FLUIDITA' DI RETE


Rapido: Abbassatelo solo se avete una connessione buona. Quanto basso?

Mi dispiace per tutti quelli che giocavano a Battlefield 3 su console e che pensavano a sparare e divertirsi senza doversi scervellare a capire tutti i problemi di lag di un FPS. Questa mia serie di articoli, giunta all'ottavo appuntamento, era nata per incuriosire e spiegare a chi aveva interesse, cosa ci fosse dietro ad una architettura software distribuita con un FPS.
Ora in Battlefield 4, il parametro di FATTORE FLUIDITA' DI RETE (NETWORK SMOOTHING FACTOR) è disponibile anche per le console. Perciò, ora, è necessario che anche i consollari inizino a studiare il lag e i suoi effetti.
Vediamo perciò che cosa sia questo parametro per poi dare un criterio assoluto per tararlo a dovere. Come al solito, se non lo avete fatto, ripartite dal primo articolo (link). Non nascondo che i molti complimenti ricevuti sulla chiarezza di esposizione, mi spingono a pensare bene di quanto ho scritto e perciò volentieri mi auto faccio pubblicità.
Durante l'apprendimento graduale del sistema, diciamo a metà circa, avevamo capito che
uno dei problemi del sistema era quello di far apparire i giocatori avversari sul proprio schermo, cercando di minimizzare il ritardo, il lag.

Una posizione di un avversario, infatti, deve uscire dal suo client, arrivare al server, uscire dal server, arrivare al nostro client sotto analisi.
Quello che avevamo omesso in quella sede era la forma di queste informazioni.
Riprendiamo un esempio fatto precedentemente. Ipotizzate una palla che rimbalza continuamente, per 5 volte al secondo, senza mai smorzarsi. Adesso ipotizzate di usare una macchina fotografica che fa solo 2 foto al secondo. In ingegneria, si dice che la macchina fotografica sta sottocampionando (undersampling) il segnale (il rimbalzo della palla). Se perciò prendete due foto consecutive, potreste trovare la palla in due posti casuali. Ovviamente sarebbe stato bello, ad esempio, usare una macchina fotografica che fa 1000 foto al secondo. Con 1000 foto in fila, avremmo capito e seguito esattamente la posizione della palla attraverso tutte le foto. Purtroppo però la nostra macchina fotografica è una ciofeca.

Quello che succede a voi è qualcosa di simile.
Il server invia al vostro client i pacchetti che contengono la posizione degli avversari.
Il server invia AD INTERVALLI REGOLARI (in genere funziona così) questi messaggi. Sarebbe bello ricevere continuamente la posizione degli altri, ma non è così (per tanti motivi che qui omettiamo perchè senno questo articolo diventa veramente indigesto).

Consideriamo perciò questa situazione e descriviamola in istanti di tempo successivi:
ricevo proprio ora un pacchetto con la posizione dell'avversario. La mostro a video.
Non ricevo niente
Non ricevo niente
Non ricevo niente
ricevo proprio ora un secondo pacchetto con la posizione dell'avversario. La mostro a video.
etc.
Nel periodo nel quale non ho un aggiornamento dal server, che cosa fa il gioco? Che cosa mostra a video?
Il gioco vi crea e mostra una o più immagini in modo che voi percepiate un movimento fluido del giocatore avversario.
Se non facesse così, vedreste il giocatore muoversi a scatti. Gli scatti sarebbero tanto più evidenti quanto maggiore è il tempo che passa tra un pacchetto e l'altro.
Il FATTORE FLUIDITA' DI RETE fa proprio questo.
Un valore alto di questo settaggio crea molte immagini (finte) tra un pacchetto ed un altro.
Un valore molto basso, al contrario, vi presenterà a video meno immagini finte e perciò potreste percepire un movimento a scatti visto che, negli istanti nei quali non arriva alcuna informazione dal server, il personaggio non avrebbe alcuna animazione.
Capiamo bene il significato di "finte" e un suo importante risvolto e abbiamo finito.
Se il vostro avversario stà correndo, le immagini finte saranno create tra due punti consecutivi della sua corsa. Queste immagini sono create dal client ed il server non ne sa nulla (potrebbe, ma diciamo che non lo sa).
Che succede se sparate ad una di queste immagini finte? Ricordate il meccanismo di lag compensation? Purtroppo lo state mettendo in crisi. Facciamo un esempio.
Il server vi manda questi pacchetti in istanti di tempo consecutivi:
posizione avversario x = 1
niente
niente
niente
posizione avversario x = 2
Se spariamo nel primo o nel quinto istante, il server ci convaliderà sicuramente il colpo, visto che il meccanismo di lag compensation si basa, tra le altre cose, su un numero uguale ad uno che aveva precedentemente memorizzato.
Se invece spariamo mentre non arriva niente, il server avrà più difficoltà (dipendentemente dall'algoritmo di ricostruzione del movimento del vostro avversario) a convalidare i vostri colpi.
Il mio consiglio, perciò, è di tenerlo il più basso possibile.
Personalmente riesco a tollerare anche brevissimi momenti di scattosità (brevi e molto leggeri), ma è meglio sapere di puntare ad un avversario la cui posizione è stata generata da una informazione mandata dal server, piuttosto che a un fantasma generato dal client.
State attenti però. Non stiamo parlando solo di lag, ma anche di jitter. Resistete che è finito.
Il sito http://www.pingtest.net/ fornisce due informazioni: il ping e il jitter. Il ping è andata e ritorno perciò il delay secco tra server e client è la metà. Il jitter è la variazione in frequenza, ovvero quanto può cambiare il valore di ping.
Ipotiziamo di avere questo risultato:
ping 140
jitter 100
Il jitter è la variazione temporale del vostro ping. Il che vuol dire che un pacchetto (dal server al client) potrebbe arrivare dopo 70 (numero fisso) + un numero variabile tra 0 e 100 ms.
Se perciò il server invia i pacchetti periodicamente ogni tot millisecondi, questo treno di pacchetti non arriverà mantenendo gli stessi intervalli relativi.
Un pacchetto potrebbe arrivare con 0 di jitter
Un secondo potrebbe arrivare con 50 di jitter
Etc.
A quel punto il "movimento a scatti" non sarebbe periodico, ciclico, ma altamente casuale. La scattosità potrebbe presentarsi più o meno accentuata in intervalli diversi.
Partite perciò da 0 e aumentate solo se la situazione è inaccettabile.
Se avete comunque un alto ping o un alto jitter, mi dispiace per voi ma vi toccherà "vedere i fantasmi".

Nel prossimo articolo (link) vedremo qualche dubbio sulla distruzione in Battlefield .

12 commenti:

  1. mmmmm.....che fluidità devo mettere io? XD

    RispondiElimina
    Risposte
    1. E alla fine arrivarono i burloni con 100 Mega e fibra ottica e alchimie varie. TRIPLO LOL. Tu metti -20.
      Per tutti gli altri "poveri di internet" ho fatto in ritardo un piccolo video in un server australiano, cercando di mostrare gli scatti del personaggio con fattore 0 e la maggiore fluidità con valore 100. Aguzzate la vista

      http://www.youtube.com/watch?v=l4FS54Murrk

      Elimina
  2. Ecco il mio, Link: http://memecrunch.com/meme/16C9X/net-code/image.png

    RispondiElimina
  3. in effetti all'inizio avevo messo 100 e diciamo che vedevo meno gente a scatti però spesso quando sparavo a qualcuno dei colpi andavano a vuoto nonostante la precisione; adesso ho messo 0, vedo fantasmi che in un momento sono a 10mt poi riappaiono ad 1mt...ma almeno quando li prendo faccio male o muoiono!!!

    RispondiElimina
  4. A proposito di netcode, server lag e quant'altro: qualcuno ha notato le icone citate in questo post sul Battlelog?

    http://blogs.battlefield.com/2014/03/addressing-netcode-in-bf4/

    RispondiElimina
  5. Verificato ieri in game su Firestorm (Conquista Grande): nei momenti in cui il movimento cominciava ad essere meno fluido e con qualche sctto in alto a destra, subito sotto le scritte che annunciano "chi ha ammazzato chi", mi è apparsa l'icona dei "packet loss" ovvero i quattro quadratini semisovrapposti in diagonale.

    Non mi è mai capitato di vedere, almeno ieri, l'icona dell'orologio che starebbe a certificare un lag rispetto al server troppo elevato per poter essere bilanciato dal netcode.

    Per completezza di informazioni vi riporto che sul router ho impostato il valore corretto di MTU (1492 - connessione con Fastweb FTTC 45Mbps/10Mbps - ping su maya.ngi 32ms) per cui i miei pacchetti non dovrebbero essere frammentati e, di conseguenza, il rischio di perdita dovrebbe essere basso se non nullo; le prove con speedtest.net, che faccio frequentemente, mi danno sempre 0 packet loss e 0 jitter.

    Comunque adesso tutti sappiamo, nel caso non ce ne fossimo accorti, che il netcode ciocca ed in più la DICE, gentilissima, ci informa pure con una comoda segnalazione a video.

    Mille grazie

    RispondiElimina
    Risposte
    1. Sono 5 mesi e il gioco, dal punto di vista del netcode, fa schifo. Andate su OPZIONI. Hanno aggiunto il TEST DI SISTEMA. Risultato: la mia connessione è scadente. Ma fatemi il piacere. Ultimo gioco che compro dalla Dice. Se continua così, inoltre, la presa per il culo, allora chiudo sto blog. 5 mesi e ora abbiamo icone che dicono che perdiamo pacchetti? Va andateve tutti a ....

      Elimina
  6. Questa del test sistema mi era sfuggita, appena torno a casa provo.

    L'icona dei "packet loss" mi appare di frequente in Firestorm e Gulf of Oman, in quest'ultima quasi sempre dopo l'arrivo della tempesta (si vede che la connessione è sensibile al tempaccio....); in compenso non ho mai notato quella dell'orologio che, se ho capito bene, indicherebbe una latenza sul server troppo elevata per essere compensata dal netcode.

    Giocando questa settimana mi è sembrato che i problemi si fossero un pò ridotti, sbaglio?

    RispondiElimina
  7. Fatto il test giusto due minuti fa con risultati contrastanti a parità di server, eccoli:

    Server: ps4-MONKEY-WARSAW

    prima di scegliere la partita:
    tre tacche verdi, nessun problema, connessione buona, latenza 0.03sec, nessun pacchetto perso

    dopo essere entrato nel match (stesso server):
    1 tacca rossa, gravi problemi di perdita di pacchetti, latenza 0.20sec, pacchetti persi in uscita da 12% a 17.5% (attnzione: solo in uscita)

    RispondiElimina
    Risposte
    1. Incredibile, eh? It's magic.
      Comunque, per la cronaca e a beneficio di tutti, WARSAW è il nome in codice per battlefield 4 e non un server di Varsavia.

      Elimina
  8. Ecco, questa di WARSAW mi mancava....

    Quindi i risultati del test si riferiscono effettivamente al server dove stai giocando, immagino.

    RispondiElimina
  9. Che mi sai dire della perdita pacchetti dati in entrata??? Spesso quando gioco mi appare il quadratino in alto a destra e poi scompare e cosi via. Gioco su PS4 e succede da quando c'e stato l'attacco hacker 24-25/12/2014.. Qualcuno ha dei consigli???

    Ps. Ho controllato modem, provider, cavo ethernet e risulta tutto apposto.

    RispondiElimina