12 April, 2018

6 mins de lecture

For Honor et l'input lag

Remarque : dans cet article, le 30 FPS nous servira de référence puisque c'est le mode commun à toutes les plateformes pour For Honor.

LA GENÈSE DU TIME SNAP

Dès le départ, l'Art of Battle a constitué la pierre angulaire conceptuelle de For Honor. Nous avons toujours cherché en priorité à ce que les postures d'attaque et de blocage soient aussi claires et lisibles que possible. Voici un petit exemple du problème auquel notre équipe s'est retrouvée confrontée à l'origine lors du développement du jeu :

Video 1

Dans la vidéo 1, le défenseur parvient à bloquer l'attaque en effectuant un changement de posture au dernier moment possible.

Video 2

Nous avons comparé ceci à un blocage raté, le défenseur saisissant alors le changement de posture 33 ms plus tard. Comme indiqué dans la vidéo 2, nous avons estimé que le manque de différence était source de frustration pour le défenseur. Pour améliorer la lisibilité, nous avons estimé que la différence entre un blocage réussi et un blocage raté devait toujours être d'au moins 100 ms.

fh_inputlag_figure1

Pour y parvenir, nous avons créé le système « Time Snap », qui alignait les actions de tous les joueurs à la période de 100 ms suivante sur une horloge globale. Comme indiqué dans la figure 1, même si le joueur 1 a appuyé sur la touche d'attaque 33 ms avant le joueur 2, les deux actions s'exécutent en même temps, ce qui conduit ici à un échange de coups.

LES PROBLÈMES DU TIME SNAP

Le Time Snap avait pour inconvénient majeur d'ajouter un input lag supplémentaire et aléatoire de 0 ms, 33 ms ou 66 ms selon le moment de l'input par rapport à l'horloge globale. À l'époque où le jeu était encore en développement, notre équipe avait jugé cet impact acceptable, mais nous avons vite changé d'avis.

En continuant à affiner l'équilibrage et le confort de jeu, nous avons reçu des retours de nos tests internes et externes qui nous ont fait remettre en question la réactivité de nos inputs de changements de posture. Nous avons donc choisi de retirer le Time Snap pour le changement de posture, ce qui a résolu une partie des problèmes de réactivité des inputs mais aussi défait en grande partie l'objectif initial du Time Snap.

Après la sortie officielle du jeu, nous avons décidé de supprimer totalement le Time Snap parce que nous tenions absolument à supprimer cette incohérence de réactivité d'input. Or, puisque le système compensait en quelque sorte la latence du réseau, sa suppression aurait eu d'autres effets sur la jouabilité.

Observons les différents cas de figure pour mieux expliquer comment ce système fonctionnait. Pour simplifier, mettons que nous avons 100 ms de latence réseau entre l'attaquant et le défenseur.

fh_inputlag_figure2

Dans la figure 2, l'attaquant effectue son input à 400 ms : l'attaque a donc lieu immédiatement. Le défenseur reçoit cet input 100 ms plus tard et rate donc les 100 premières millisecondes de l'attaque.

fh_inputlag_figure3

Dans la figure 3, l'attaquant effectue son input à 366 ms. L'attaque a toujours lieu à 400 ms. Cet input lag de 33 ms compense la latence réseau puisque le défenseur ne rate plus que les 66 premières millisecondes de l'attaque.

fh_inputlag_figure4

Enfin, dans la figure 4, l'attaquant effectue son input à 333 ms. L'attaque a toujours lieu à 400 ms. Il y a donc 66 ms d'input lag grâce auxquelles le défenseur ne rate plus que les 33 premières millisecondes de l'attaque.

Cette compensation de la latence réseau étant aléatoire, il n'est pas possible de s'y fier pour réagir aux attaques. Nous avons estimé que, puisqu'une fois sur trois les attaques n'avaient aucune compensation de latence, la suppression du Time Snap n'aurait pas d'impact négatif sur les chances de réaction des joueurs. Toutefois, les retours de la communauté ont mis en évidence qu'en remplacement de ce Time Snap incohérent, il fallait trouver une solution à la perte d'informations supplémentaire provoquée par sa suppression.

IMPLÉMENTATION ACTUELLE

fh_inputlag_figure5

L'implémentation proposée ici est une approche hybride de l'input lag : tous les inputs considérés comme « offensifs » (liste ci-dessous) feront l'objet d'un retard fixe de 33 ms. Cette valeur n'a pas trop d'effet sur la réactivité d'input puisqu'elle n'impacte que nos actions « offensives » qui sont, par définition, longues. Comme indiqué dans la figure 5, si un attaquant déclenche une attaque depuis l'état neutre, au lieu de la lancer de façon localisée, elle ne se lance que 33 ms plus tard. Ainsi, la partie de l'attaque cachée au défenseur est réduite à hauteur de l'input lag (de 100 à 66 ms), ce qui améliore son créneau de réaction.

Qu'est-ce que vous entendez par « input offensif » ?

  • Une Attaque faible est toujours considérée comme un input offensif
  • Une Attaque puissante est considérée comme un input offensif, sauf en cas de Parade (il n'y a alors pas de retard)
  • Un Brise-Garde est généralement considéré comme offensif sauf s'il est utilisé défensivement pour un Contre-Brise-Garde (pas de retard)
  • Un changement de posture à la même frame qu'une Attaque faible ou puissante retarde le changement de posture afin qu'il commence en même temps que l'attaque
  • Une Esquive ou Annulation/Feinte est considérée comme offensive si elle est déclenchée pendant un input offensif déjà retardé, ceci afin d'éviter une inversion d'input qui pourrait provoquer du flicker
  • Relâcher un Brise-Garde, une Attaque faible ou puissante est également considéré comme un input offensif puisque cette action peut déclencher des attaques pour certains personnages (ex. : la Charge des tempêtes de l'Orochi)

PROCHAINES ÉTAPES

Après avoir testé cette implémentation en interne ainsi qu'avec des membres de notre communauté, nous pensons qu'il s'agit d'une bonne première étape dans l'amélioration des capacités de réaction qu'offre notre système de combat. Elle aura un léger impact sur le timing de certaines actions comme les enchaînements, les linkers ou les annulations, puisqu'il faudra les saisir 33 ms plus tôt. Nous envisageons actuellement d'autres moyens d'améliorer la gestion de la latence réseau dans le jeu, mais nous tenions à déployer cette première modification pour vous offrir une meilleure expérience le plus vite possible. Comme toujours, nous vous tiendrons informés de toutes les évolutions à ce sujet.