Kevin Lee, développeur logiciel sur le projet Valorant, nous parle aujourd'hui de la détection des impacts dans le jeu.

Salut, moi c'est Kevin Lee, développeur logiciel dans l'équipe des systèmes de jeu de VALORANT. C'est nous qui sommes chargés de mettre au point beaucoup des systèmes clés qui soutiennent le gameplay de VALORANT, dont les déplacements, le combat et la gestion des données d'entrée. Dans cet article, je vais vous présenter un système en particulier qui est essentiel à tout FPS : la détection des impacts.

Dans un jeu comme VALORANT, prendre correctement en compte le résultat d'un tir est sans doute une des fonctions les plus importantes quand on sait qu'une victoire se joue parfois à un tir dans la tête près. Notre objectif en tant que développeurs est de nous assurer que quand vous effectuez un tir, son résultat soit clair, qu'il ait l'air cohérent et surtout, qu'il frappe là où il doit frapper.

Nous voyons parfois passer des sujets ou nous recevons des messages avec des vidéos qui montrent une mauvaise prise en compte de l'impact. Nous prenons tous ces signalements très au sérieux et nous étudions chaque vidéo image par image pour attester que le système fonctionne correctement.

Ceci étant dit, nous sommes satisfaits de la détection des impacts dans VALORANT à l'heure actuelle. C'est vrai, il peut rester quelques bugs sporadiques à la marge et nous les étudions sérieusement. Nous cherchons toujours à améliorer la qualité et la clarté de tous nos systèmes.

PRÉCISION CONTRE CLARTÉ

Le patch beta 0.50 a vu un pic de signalements autour du problème de la détection des impacts. Après avoir épluché les rapports des joueurs, regardé les vidéos et renforcé les tests en interne, nous avons pu identifier quelques cas avérés à la marge, mais aucun qui ne soit assez grave pour expliquer l'avalanche de commentaires reçus. Après inspection approfondie, il est apparu que le problème rencontré dans la majorité des vidéos ne concernait pas la précision, mais la clarté. Les tirs étaient bien pris en compte par le système mais le retour visuel présentait au joueur un résultat fallacieux. Ceci éclaire une différence importante entre précision et clarté.

Si l'une et l'autre sont importantes pour assurer une bonne « sensation » de tir...

  • La précision s'occupe de savoir si le tir a atteint la cible visée (c'est-à-dire la tête et non le corps, par exemple, ou que la position de l'ennemi n'était pas enregistrée à deux endroits différents sur l'écran du joueur et sur le serveur).
  • La clarté, elle, s'intéresse à la représentation du tir, à savoir s'il est lisible (c'est-à-dire que le retour visuel ne donne pas l'impression que la balle a atteint la tête quand c'est l'épaule qui a été touchée).
  • Les bugs de précision sont bien plus graves que les bugs de clarté.

Dans cet article, nous espérons éclaircir un peu le fonctionnement du système pour que vous puissiez toutes et tous étudier vos parties et comprendre ce qu'il se passe à l'écran en termes de tirs. Je vais décrire comment le système fonctionne à haut niveau et décrire son déroulement du moment où vous appuyez sur la touche de tir jusqu'à l'affichage du tir à la tête.

Pour un compte rendu plus détaillé et plus technique, lisez cet article (en anglais) à propos du netcode de VALORANT sur le blog tech de Riot.

Je vous donnerai également quelques cas d'école de ce qui nous est signalé à tort comme une « mauvaise détection des impacts », puis j'essaierai de commenter ce qu'il se passe et d'expliquer ce que nous faisons pour améliorer la clarté de ces situations.

DU CLIC AU TIR DANS LA TÊTE

Avant de plonger dans les détails d'un tir, prenons le temps de comprendre comment le jeu simule ce qui se passe. Les actions dans VALORANT sont simulées deux fois : une fois sur le serveur (c'est lui qui détermine le résultat de l'action) et une autre fois sur votre machine (qui prédit le résultat du serveur pour améliorer le temps de réponse du jeu).

La simulation prend en compte toute la scène : la position des agents, les compétences qui passent à l'écran, toute présence de fumée sur le champ de bataille, etc. À chaque image, le jeu fait une capture de la simulation en cours et l'utilise pour retransmettre ce qui se passe à l'écran. Le serveur fait aussi cela pour chaque image (la retransmission visuelle en moins puisque que personne ne le regarde, lui).

OK, imaginons maintenant qu'un ennemi jette un œil derrière un coin et que grâce à l'excellent placement de votre viseur, vous avez déjà fixé le canon de votre arme sur sa tête, il ne vous reste donc plus qu'à faire un clic gauche pour tirer, et... que se passe-t-il ?

Au moment où vous appuyez sur une touche, cette donnée est envoyée à notre système de traitement (moyennant un petit délai dépendant de votre configuration ou de votre système d'exploitation). Pour chaque image du jeu, le système de traitement des données d'entrée calcule la différence entre tout ce qu'il vient de recevoir et l'image précédente. Quand vous tirez, cette information est envoyée au serveur associée au moment exact de l'image à laquelle elle appartient.

Notez bien que ce moment correspond à ce qui est affiché en temps réel sur votre écran à l'instant où l'information est reçue par VALORANT. Suivons maintenant la progression du tir dans les deux simulations : celle de votre ordinateur et celle du serveur.

Commençons par ce qu'il se passe sur le client, dans votre appareil. Dès que l'information de tir est envoyée au serveur, le client commence à afficher un effet de lumière au bout du canon et la trace du tir dans l'air. Ces effets sont affichés au plus tôt une image après la réception de la donnée de tir puisque le jeu a besoin d'afficher une image différente de la précédente sur votre écran. C'est un point important, parce que ça veut dire que l'image dans laquelle le tir est traité n'est PAS celle dans laquelle sa trace est affichée, mais au minimum celle juste avant.

Cela peut parfois altérer la clarté du tir. Une façon commune de résoudre ce problème de désynchronisation est de ralentir la balle. Nous ne le faisons pas car cela ajouterait un nouveau délai, le temps de traiter cette donnée supplémentaire, or nous voulons réduire la latence dans VALORANT au minimum. Si le tir touche, le client attend de recevoir du serveur la confirmation de la réussite avant de l'afficher. Afin de garantir que tout le monde ait la même information et d'empêcher les tricheurs de hacker leur client pour lui communiquer un faux résultat, le serveur détient l'autorité absolue à l'égard du résultat du tir.

Pendant ce temps-là, le serveur reçoit enfin du client l'information qu'un tir vient d'être effectué. À cause de la latence du réseau internet, du temps a passé depuis que l'action a été réalisée. Pour s'assurer que le tir progresse dans la même simulation qu'affichait l'écran du joueur au moment critique, le serveur rembobine sa propre simulation jusqu'à l'instant T communiqué par le client avant d'évaluer le résultat du tir. Cela veut dire retrouver la position du joueur et la pose de son personnage. Le serveur renvoie ensuite le résultat du tir au client. Disons pour l'exemple que vous avez atteint votre cible en pleine tête !

Le client va recevoir un message du serveur lui indiquant cette information et va donc afficher les effets visuels et sonores correspondants. Dans notre cas, ceux du tir dans la tête. Puisque le client doit attendre que le serveur lui communique le résultat du tir, il y a déjà un décalage entre l'affichage de la trace de la balle et l'animation du résultat égal au temps d'un cycle d'échange de l'information avec votre connexion (soit 40 ms vers le serveur = 80 ms de retard entre la trace et l'affichage du résultat), plus un petit temps d'analyse. À des latences plus élevée, ce décalage devient visible à l'œil nu.

C'est un point sur lequel nous travaillons activement pour améliorer la clarté.

ÉTUDE DE CAS N°1 : tirer sur une cible en mouvement

Beaucoup des signalements décriant la détection des impacts concernaient des cibles en pleine course. Examinons précisément comment ça se passe quand un tir atteint un ennemi en mouvement. Nous voyons que le joueur réussit son tir dans la tête contre l'ennemi qui court. Pour illustrer cette situation plus facilement, le client est à 60 IPS. Voyez comme dans l'image précédant l'affichage de la trace, le viseur est aligné avec la tête de l'ennemi.

 

En revanche, dans l'image qui affiche le tir, ce n'est déjà plus le cas.

Le deuxième exemple présente la même situation mais dans le cas où le tire manque sa cible de peu. Quand on étudie la vidéo image par image, on voit qu'il se passe l'inverse de précédemment : le viseur est décalé par rapport à la tête avant l'apparition de la trace, mais aligné au moment où elle est affichée. À première vue, on pourrait pointer l'image qui affiche le tir et dire : « vous voyez, j'avais clairement réussi mon tir ! » Mais quand nous recevons une rediffusion de vos parties, nous devons en fait examiner l'image qui précède l'apparition de la trace de la balle pour obtenir une représentation réelle du moment où le tir a été effectué.

 

Revenons à notre exemple de tir réussi et étudions l'image dans laquelle les effets de réussite sont affichés. Il y a un décalage visible entre la position actuelle de l'ennemi et celle de l'effet visuel dû au retard causé par la latence. Ça peut être assez déroutant quand vous essayez de comprendre ce qu'il s'est passé au moment du tir, puisque vous avez toutes les chances de vous intéresser à la dernière position de l'ennemi et non à celle qu'il avait au moment du tir. C'est encore plus saisissant dans une situation où l'ennemi se baisse ou bouge dans tous les sens (que nous étudierions dans l'étude de cas n°2).

Ce cas illustre le problème de clarté de la détection des impacts actuelle. Vous ne devriez idéalement pas avoir besoin de comprendre tous ces paramètres pour pouvoir lire une situation de façon claire. En tant que développeurs, nous le comprenons et cherchons des moyens d'améliorer la clarté de ces situations.

ÉTUDE DU CAS N°2 : se baisser pile dans l'effet visuel

Vous êtes en plein duel de tirs à longue distance. À votre plus grand malheur, vous maintenez le clic gauche enfoncé et tirez en rafale. Allez, il va bien y avoir une balle qui va atteindre la tête, non ? Eh non, vous touchez 3 fois le corps de l'ennemi avec votre Vandal, infligez 117 points de dégâts avant de recevoir un tir en pleine tête en retour.

Dans un accès de colère, vous regardez l'enregistrement de ce moment après la partie, avec la conviction que la détection des impacts vous a floué. Vous voyez l'ennemi s'accroupir non-stop pour essayer d'esquiver vos balles. Et là, surprise, vous voyez clairement un effet visuel de réussite de tir apparaître pile sur sa tête au moment où il se baisse. Mais votre rapport de combat ne fait état que de tirs dans le corps ! Comment ça se fait ??

Voici un lien vers un post Reddit réel (en anglais) intitulé « Un tir dans la tête non détecté quand le joueur s'est baissé » pour illustrer notre exemple.

Parmi tous les cas sur lesquels notre équipe a pu enquêter à l'égard d'une mauvaise détection des impacts, les situations de ce genre sont les causes les plus fréquentes de signalement. En fait, le tir est correctement pris en compte. Le tir frappe l'endroit que vous avez visé (en ignorant la dispersion ou l'erreur de déplacement) au moment où vous avez appuyé sur la touche de tir, et le serveur enregistre correctement cette information.

Cependant, un certain nombre de facteurs différents donnent l'impression que ce n'est pas le cas.

  1. Il y a un retard dans l'affichage des effets visuels dû à la latence
  2. Les effets sont affichés à l'endroit réel de l'impact
  3. La cible est en mouvement (et le plus souvent, en train de s'accroupir)

Disons que le joueur souffre de 50 ms de retard. Il touche l'ennemi à l'épaule. Puisqu'il faut attendre que le serveur confirme le résultat, ce n'est que 100 ms plus tard que l'effet visuel va se lancer à la position d'arrivée de la balle. Mais pendant ces 100 ms, l'ennemi s'est baissé, il a positionné sa tête pile à l'endroit où l'effet visuel du tir vient de s'afficher. À longue distance et sous la pression du duel, un effet de tir dans le corps peut être confondu avec un effet de tir dans la tête.

C'était un problème particulièrement handicapant lors du patch 0.50 quand nous avons désactivé l'effet de sang pour tout le monde sans faire exprès, et que la différence de l'effet d'étincelles pour un tir dans la tête et un tir dans le corps était moins nette. Nous avons toujours différencié les effets de tirs dans le corps et ceux de tirs dans la tête, mais il est vrai qu'ils n'ont pas toujours été très faciles à distinguer en combat.

C'est un défaut de clarté dans la détection des impacts que nous essayons de résoudre. Une des solutions auxquelles nous pensons est de lier l'effet visuel à l'endroit du corps touché pour que l'association soit claire, même avec un ping élevé.

Voici une comparaison de l'effet de tir dans la tête sans le sang actuel avec l'effet de tir dans le corps :

 

AMÉLIORATIONS PRÉVUES POUR LA CLARTÉ

Ces deux études de cas mettent en lumière les situations dans lesquelles nos effets de validation des tirs pèchent. Un des correctifs que nous sommes en train de tester consiste à afficher du sang et des étincelles sur la position réelle du personnage qui suivent son mouvement en fonction de l'endroit du corps qui a été touché. Cela permettrait d'améliorer sensiblement la clarté des situations similaires au cas n°2, où l'ennemi se baisse, en forçant les effets à suivre le déplacement du personnage.

Un inconvénient de cette méthode est qu'il serait alors possible d'avoir un effet de confirmation de tir joué derrière un élément de décor si le personnage s'est mis à couvert entre-temps. Imaginez un cas où un joueur avec 100 ms de ping tire sur un autre qui sort d'un coin pour s'y recacher immédiatement. Si le tir est réussi juste avant que l'ennemi ne retourne à couvert le temps que le client reçoive la confirmation du tir de la part du serveur, le tireur ne pourra pas visualiser l'effet au moment où il apparaît.

Pour palier ce problème nous avons pensé à ajouter des particules dont certaines suivent le personnage et d'autres apparaissent immédiatement à l'endroit du tir, à partir de la simulation du client. Mais cette solution peut prêter à confusion si les simulations respectives du client et du serveur sont en désaccord sur le résultat du tir : un effet doit indiquer sans ambiguïté ce qu'il représente si l'on veut que le résultat du tir soit clair.

Nous continuons de tester des moyens de résoudre ce problème et d'autres concernant la clarté et nous espérons pouvoir vous proposer un ensemble de mises à jour dans un prochain patch.

CONTINUEZ À NOUS ENVOYER DES VIDÉOS

L'objectif de cet article était de vous aider à mieux comprendre comment les tirs sont pris en compte dans VALORANT et pourquoi ils se déroulent de cette façon. Continuez à nous envoyer des vidéos chaque fois que vous avez l'impression que la détection des impacts ne fonctionne pas correctement, nous essayons vraiment de toutes les regarder.

Même s'il se révèle qu'il n'y avait en fait pas de problème, cela nous aide repérer plus vite les défauts de notre détection des impacts au moment où ils arrivent (mon cœur rate un battement chaque fois que je vois qu'un post avec « détection des impacts » dans le titre à recueilli plein de votes sur Reddit).

Voici le lien d'un exemple de problème avéré avec la détection des impacts repéré sur Reddit.