La situazione sulla registrazione dei colpi

Il nostro collega ingegnere informatico spiega come il team si sta impegnando per migliorare chiarezza e precisione della registrazione dei colpi

Ciao, sono Kevin Lee, un ingegnere informatico del team dei sistemi di gioco di VALORANT. Il nostro team si occupa di realizzare molti dei sistemi principali che supportano il gameplay di VALORANT, tra cui movimento, combattimento e input. In questa sede tratterò uno dei sistemi fondamentali per il gameplay di uno sparatutto in prima persona: la registrazione dei colpi.

In un gioco come VALORANT, la registrazione dei colpi è probabilmente uno dei sistemi più importanti, dal momento che la differenza tra una vittoria e una sconfitta spesso può dipendere da un singolo colpo alla testa. Il nostro compito di sviluppatori è fare in modo che, quando un giocatore spara, il risultato di tale azione sia chiaro, risulti giusto e soprattutto corretto.

A volte vediamo post o riceviamo messaggi dai giocatori con video in cui la registrazione dei colpi appare sbagliata. Prendiamo molto seriamente tutte queste segnalazioni, e analizziamo ogni video fotogramma per fotogramma per verificare che il sistema funzioni come previsto.

Detto questo, riteniamo che al momento la situazione della registrazione dei colpi in VALORANT sia piuttosto buona. Non escludiamo, ovviamente, che potrebbe esserci ancora qualche caso estremo, ma vi assicuriamo che lo affronteremo sempre seriamente. Siamo alla costante ricerca di nuovi modi per migliorare qualità e chiarezza di tutti i nostri sistemi.

LA DIFFERENZA TRA CORRETTEZZA E CHIAREZZA

Nella patch 0.50 della beta, abbiamo riscontrato un picco delle segnalazioni relative ai problemi della registrazione dei colpi. Dopo aver analizzato le segnalazioni e i video dei giocatori e a seguito di moltissimi test interni, siamo riusciti a identificare alcuni bug rari relativi alla registrazione dei colpi, ma nessuno abbastanza grave da giustificare la quantità di segnalazioni ricevute. A una più attenta analisi, la maggioranza dei video faceva emergere problemi non di correttezza, ma di chiarezza. I colpi venivano elaborati correttamente, ma la risposta visiva presentava al giocatore un risultato ingannevole. Questo evidenzia un'importante distinzione tra correttezza e chiarezza.

Sebbene siano entrambe importanti per percepire l'effetto di un colpo...

  • La correttezza si riferisce all'accuratezza dell'esito di un colpo (es. il proiettile colpisce la testa ma viene registrato come uno sparo al corpo, o i giocatori nemici appaiono diversamente sul client rispetto al server)
  • La chiarezza si riferisce alla difficoltà di interpretare visivamente il risultato di un colpo (es. il proiettile colpisce la spalla, ma visivamente sembra che abbia preso la testa)
  • I bug alla correttezza sono molto più gravi rispetto a quelli che riguardano la chiarezza

Speriamo che questo articolo renda più chiaro il sistema, affinché tutti possano ripensare al proprio gameplay e capire cosa sta succedendo sullo schermo in relazione ai propri colpi. Ora parlerò di come funziona il sistema ad alto livello, e spiegherò cosa succede dal momento in cui si preme il pulsante di fuoco a quando viene mostrato il colpo alla testa.

Per un'analisi più tecnica, leggete questo articolo sul netcode di VALORANT sul blog Riot Tech.

Analizzerò anche qualche caso tipico di segnalazione relativa alla "registrazione dei colpi sbagliata", cercando di spiegare cosa succede e cosa stiamo facendo per migliorare la chiarezza in situazioni del genere.

DA UN CLIC A UN COLPO ALLA TESTA

Prima di addentrarci in cosa succede quando viene sparato un colpo, è importante capire come il gioco simula quello che sta succedendo. Il gameplay di VALORANT viene simulato due volte: una sul server (l'ambiente principale della simulazione, responsabile di ogni decisione finale) e una sul vostro client (che predice i risultati del server per rendere il gioco più reattivo).

La simulazione comprende tutto ciò che contiene il mondo di gioco, comprese le posizioni di tutti i giocatori, eventuali abilità in azione e fumogeni nel campo di battaglia. A ogni tick, il gioco cattura un'istantanea della simulazione e la usa per renderizzare un fotogramma sul vostro schermo. Anche il server fa lo stesso per ogni suo tick (saltando la parte di rendering, visto che non c'è nessuno a guardare).

Analizziamo ora il seguente scenario: un nemico spunta da dietro un angolo e voi, grazie alle vostre incredibili capacità di posizionamento del reticolo, gli state già puntando la testa. Premete il pulsante sinistro del mouse per sparare e... che succede?

hit_reg_flow.jpg

Nel momento in cui premete un tasto, l'input viene inviato (dopo una piccola quantità di latenza dovuta a hardware/sistema operativo) al sistema di input del gioco. Per ogni tick, il sistema di input elabora tutti gli input ricevuti dal tick precedente. Quando sparate, il comando "spara" viene inviato al server insieme a un timestamp che rappresenta il tick in cui, nella simulazione, è avvenuto lo sparo.

È importante ricordare che questo timestamp si basa su quello che è renderizzato sul vostro schermo al momento in cui l'input viene ricevuto da VALORANT. Ora dobbiamo seguire il colpo in due simulazioni differenti: quella del client e quella del server.

Partiamo dal client, ossia il vostro computer. Immediatamente dopo che il colpo è stato inviato al server, il client elabora tutti i dati inerenti per mostrare una vampata e un tracciante. Al più presto, questo avviene un fotogramma dopo che l'input è partito, dal momento che il gioco deve renderizzare un nuovo frame sul vostro schermo. Questo è importante, perché significa che il fotogramma nel quale il colpo viene elaborato NON è lo stesso in cui viene mostrato il tracciante, ma almeno il precedente.

Questo a volte può provocare un problema di chiarezza del colpo. La soluzione più comune per correggere questo problema di sincronizzazione è ritardare il proiettile. Noi abbiamo deciso di non adottarla, perché rallentare il proiettile aggiunge una latenza all'input, che in VALORANT vogliamo ridurre al minimo. Per quanto invece riguarda l'esito, il client attende la risposta del server relativa al risultato prima di confermare il colpo. Per garantire coerenza tra tutti gli utenti ed evitare che i cheater violino i propri client per creare risultati falsi, l'esito dei colpi dipende interamente dal server.

Intanto, il server riceve finalmente un messaggio dal client che dice che il colpo è stato sparato. A causa della latenza di Internet, è passato del tempo da quando è stato sparato il colpo. Per assicurarsi che il colpo venga sparato nello stesso stato della simulazione mostrato al giocatore, il server riavvolge la simulazione fino al timestamp fornito dal client prima di valutare la registrazione del colpo. Questo riavvolgimento comprende le posizioni dei giocatori e le animazioni. Dopodiché, rimanda al client il risultato del colpo. Nel nostro esempio, diciamo che si è trattato di un colpo alla testa!

Il client riceverà un messaggio dal server con il risultato del colpo, per poi riprodurre gli effetti visivi e sonori appropriati. In questo caso, quelli di un colpo alla testa. Dal momento che il client deve attendere che il server gli comunichi il risultato del colpo, c'è un ritardo fra il tracciante e gli effetti del colpo pari al tempo di andata/ritorno della vostra connessione (es. 40 ms per raggiungere il server, che corrispondono a circa 80 ms di ritardo fra tracciante ed effetti visivi), più una quantità minore di tempo di elaborazione. A latenze più alte, questo ritardo può diventare percettibile.

Stiamo lavorando attivamente su questo aspetto dal punto di vista della chiarezza.

CASO STUDIO 1: colpire bersagli in movimento

Case_Study_1.gif

In molte segnalazioni relative alla registrazione dei colpi, abbiamo notato che il bersaglio sta correndo. Diamo un'occhiata più da vicino a cosa succede visivamente quando un colpo raggiunge un bersaglio in corsa. Vediamo che il giocatore mette a segno un colpo alla testa sul nemico che corre. Per illustrare più chiaramente la questione in questo esempio, ipotizziamo che il client stia girando a 60 fps. Notate che, nel fotogramma precedente alla comparsa del tracciante, il reticolo è allineato alla testa del nemico.

case-study-1_frame-1.jpgcase-study-1_frame-2.jpg

Nel fotogramma in cui appare il tracciante, però, non è più così.

case_study_1_part_2.gif

Il secondo video mostra lo stesso scenario, ma il colpo manca di poco il bersaglio. Osservando il video fotogramma per fotogramma potete vedere che si tratta del caso contrario al primo: il reticolo è disallineato dalla testa nel fotogramma prima del tracciante, ma sulla testa in quello in cui il tracciante appare. A una prima occhiata, verrebbe da guardare il fotogramma con il tracciante e pensare che si è effettivamente trattato di un colpo alla testa. Quando analizziamo i video o i replay, in realtà guardiamo il fotogramma precedente al tracciante per capire quando è stato sparato esattamente il colpo.

case-study-1_part2_frame-1.jpgcase-study-1_part2_frame-2.jpg
case-study-1_part2_no-hit-vfx.jpg

Torniamo all'esempio in cui il colpo è andato a segno e guardiamo il fotogramma in cui è stato renderizzato l'effetto visivo. C'è una distanza evidente tra la posizione del giocatore e quella dell'effetto visivo del colpo, dovuta al ritardo provocato dalla latenza di Internet. Questo può generare confusione quando provate a capire cos'è successo al vostro colpo, dal momento che tendete a concentrarvi sulla posizione attuale del nemico, anziché su quella al momento dello sparo. Ciò può creare ancora più confusione in situazioni di accovacciamento/movimento laterale (che vedremo nel secondo caso studio).

case-study-1_part2_frame-where-hit-vfx-rendered.jpg

Questo caso studio mostra una mancanza di chiarezza nell'attuale sistema di registrazione dei colpi. Idealmente, per comprendere chiaramente la situazione non dovrebbero essere necessarie tutte queste informazioni tecniche. Noi sviluppatori riconosciamo questa esigenza, e stiamo cercando di trovare il modo di migliorare la chiarezza in casi del genere.

CASO STUDIO 2: effetto visivo del colpo su accovacciamento

Decidete di ingaggiare uno scontro a fuoco sulla lunga distanza. Ancora non sapete che ve ne pentirete, ma tenete premuto il pulsante sinistro del mouse per sparare a raffica. Prima o poi un colpo entrerà in testa, giusto? E invece no, riuscite solo a piazzare 3 colpi al corpo con il Vandal infliggendo 117 danni, per poi ricevere un colpo in testa come ringraziamento.

Furiosi, a fine partita guardate il filmato certi che sia stata colpa di una pessima registrazione dei colpi. Notate che il nemico, nel tentativo di evitare i vostri colpi, si era accovacciato. Con vostra sorpresa, vedete l'effetto dell'impatto sulla sua testa mentre il nemico era accovacciato. Ma il vostro rapporto di combattimento indicava solo colpi al corpo! Com'è possibile?

Ecco come esempio il link a un post di Reddit chiamato "Headshots not registering when a player crouches" (I colpi alla testa non vengono registrati quando un giocatore si accovaccia).

Quando il nostro team indaga sulle segnalazioni degli errori nella registrazione dei colpi, situazioni del genere sono le più frequenti. In realtà, la registrazione dei colpi funziona correttamente: i colpi vanno dove state mirando (escludendo dispersione o errori di movimento) quando sparate, e vengono registrati accuratamente sul server.

Alcuni fattori però rendono questo caso particolare visivamente ingannevole:

  1. Gli effetti visivi dell'impatto del colpo vengono riprodotti in ritardo a causa della latenza di Internet
  2. Gli effetti visivi vengono emessi dal punto d'impatto originario del colpo
  3. Il giocatore colpito si sta muovendo (spesso è in procinto di accovacciarsi)

Case_Study_2.gif

Facciamo un altro esempio: il giocatore ha 50 di ping. Il giocatore piazza un colpo sulla spalla dell'avversario. Dal momento che dobbiamo aspettare che il server confermi il colpo, passano 100 ms prima che appaia l'effetto visivo del colpo al corpo. Tuttavia, durante quei 100 ms, il giocatore nemico ha iniziato ad accovacciarsi, allineando la testa con l'effetto visivo del colpo appena apparso. A distanza e nella frenesia della sparatoria, l'effetto visivo di un colpo al corpo può essere confuso con quello di un colpo alla testa.

case-study-2_cursor-on-body.jpgcase-study-2_hit-VFX-on-body-correctly.jpgcase-study-2_player-crouches-into-vfx.jpg

Questa situazione era particolarmente grave nella patch 0.50 della beta, in cui avevamo accidentalmente disattivato il sangue e le scintille della versione censurata avevano una distinzione meno chiara tra colpi alla testa e al corpo. Abbiamo sempre utilizzato effetti visivi separati per indicare i due tipi di colpi, ma siamo consapevoli del fatto che non erano sempre molto chiari in combattimento.

Questo è un problema di chiarezza della registrazione dei colpi che stiamo cercando di mitigare. Una delle cose che stiamo provando in tal senso è collegare gli effetti visivi del colpo alla parte del corpo interessata, in modo che ci sia una relazione chiara, anche in caso di latenza.

Confronto tra gli attuali effetti visivi censurati di un colpo alla testa e di uno al corpo:

headshot-VFX.jpgbody-shot-VFX.jpg

MIGLIORAMENTI ALLA CHIAREZZA IN PROGRAMMA

I due casi studio evidenziano alcune aree da migliorare nei nostri attuali effetti visivi di conferma del colpo. Una delle modifiche che stiamo studiando è far emettere gli effetti di sangue e scintille dalla parte del corpo colpita, e far sì che tali effetti seguano il personaggio. Questo aumenta moltissimo la chiarezza in situazioni come quella del caso studio 2 con i nemici che si accovacciano, perché l'effetto visivo si sposterà insieme ai movimenti del corpo.

Un lato negativo di questo approccio potrebbe essere che gli effetti visivi di conferma del colpo finirebbero in alcuni casi per essere emessi dietro un riparo insieme al personaggio a cui sono collegati. Pensate a un giocatore con un ping di 100 ms che spara a un avversario che spunta da dietro un angolo. Se il colpo va a segno e chi lo subisce si sposta immediatamente dietro l'angolo prima che dal server arrivi la conferma del colpo, chi ha sparato potrebbe non riuscire a vederla.

Per ridurre l'impatto di questo problema avevamo inizialmente pensato di utilizzare un effetto che veniva emesso sul giocatore dopo la conferma del colpo e uno che invece appariva istantaneamente in base alla simulazione del client. Questo però di contro crea problemi se le simulazioni di client e server non concordano sul risultato di un colpo: gli effetti devono essere chiari, e far capire chiaramente qual è stato l'esito.

Stiamo continuando a lavorare su questo e altri miglioramenti alla chiarezza, e speriamo di avere presto una serie di aggiornamenti in merito da condividere in una patch futura.

CONTINUATE A INVIARE VIDEO

Spero che questo articolo abbia contribuito a farvi comprendere meglio come funziona la registrazione dei colpi in VALORANT, e a farvi capire perché i colpi hanno determinati esiti. Continuate a inviarci video ogni volta che pensate ci sia un problema nella registrazione dei colpi; faremo del nostro meglio per guardarli tutti.

Anche se al momento la situazione è tranquilla, questo ci aiuta a rilevare i bug quando si verificano (ho un tuffo al cuore ogni volta che vedo la parola "registrazione dei colpi" su un post di Reddit molto votato).

Ecco per esempio un post su Reddit relativo a un bug della correttezza della registrazione dei colpi.