Analyse approfondie de la mise à jour du système de combat et d'animation

16 février 2024
|
Général

Salutations, aventuriers !

Nous allons améliorer notre système de combat et d'animations afin d'optimiser les performances dans les zones regroupant de nombreux joueurs à l'occasion de la sortie de Season of the Guardian. Ce nouveau système (que nous avons affectueusement nommé Slayer Script) nous permettra aussi d'améliorer les combats plus facilement à l'avenir. Même si nous avons tout fait pour conserver le ressenti du jeu, nous aimerions avoir vos opinions sur ces changements. Du processus de développement aux difficultés rencontrées, retrouvez Kevin Christensen, le responsable de la technologie, pour une analyse approfondie de ce nouveau système et de son impact sur le futur de New World.

Slayer Script

Slayer Script est un langage de script basé sur C++. New World le compile et le charge de façon dynamique afin de proposer des performances exceptionnelles tout en mettant les scripts à jour. Il est capable de provoquer certains événements (faire apparaître des ennemis, jouer des sons, etc.), de réagir à d'autres (si un ennemi meurt, si un joueur entre dans une pièce, etc.), d'activer des animations, de contrôler les déplacements et bien plus. Il suffit de quelques lignes de code pour toutes ces tâches.

Processus de développement

Dans New World, il y a énormément d'objets qui se mettent à jour fréquemment, d'où la difficulté d'utiliser efficacement des langages de script traditionnels. Par exemple un langage de script comme Lua doit être interprété et ne bénéficie pas d'optimisation du matériel. Même si Lua est efficace en matière de performances d'exécution, il faudrait l'utiliser pour des centaines d'objets dans New World. Ça représente trop de charge et de mémoire pour être valable. Il nous fallait une solution aussi rapide que possible qui n'affecterait pas trop le cycle de développement.

Notre système de script original pour les personnages fonctionnait bien durant le développement, mais il a fini par poser des problèmes de performances, de mémoire et d'allocation de mémoire au fur et à mesure que le développement de New World progressait. Cela nous a menés à développer Slayer Script en parallèle. Slayer Script nous a permis de réduire le nombre d'allocations, et son code compilé nativement est très compact, ce qui réduit grandement la mémoire d'exécution.

Initialement, nous comptions utiliser Slayer Script pour contrôler le joueur. Après tout, le joueur représente l'objet de jeu le plus complexe de New World. Slayer Script a été principalement conçu pour analyser les commandes du joueur et contrôler ses animations. Cette tâche allait prendre beaucoup de temps. Il s'avère que c'est l'équipe en charge des expéditions qui a utilisé Slayer Script en premier, bien que celles-ci n'aient rien à voir avec les commandes ou les animations du joueur. C'est là que Slayer Script est devenu un langage de script plus général. Ce n'est que récemment que nous l'avons utilisé pour son but original.

Objectifs

Plus de 400 actions ont été converties à la main dans le nouveau système pour s'assurer que le gameplay reste identique. Nos objectifs étaient :

  • d'utiliser du code C++ compilé nativement pour être aussi rapide que possible ;

  • de réduire la charge de mémoire en réduisant le nombre d'états à stocker ;

  • d'améliorer l'adaptabilité en utilisant une architecture qui aurait moins d'impact sur la réalisation de nouveaux comportements ;

  • de pouvoir le charger à chaud afin de réaliser un développement en direct ;

  • d'être plus facile à débugger.

Réduire la charge de mémoire s'est avéré être ce qu'il y avait de plus simple. Slayer Script sauvegarde l'état dans un seul endroit, et tous les comportements sont conçus de la même manière pour toutes les instances d'un script.

Pour l'adaptabilité, ce sera un travail continu. Même C++ peut être utilisé de manière inefficace. Il faut toujours faire attention quand on ajoute de nouvelles fonctionnalités, mais C++ propose des solutions intéressantes pour le suivi des performances et de l'exécution des opérations.

L'ancien système était difficile à débugger. Des outils ont été mis au point pour faciliter cette tâche, mais il restait impossible d'intervenir durant l'exécution. Tout créateur disposant d'un outil de débug peut désormais désigner des points de rupture, étudier la mémoire et intervenir durant l'exécution d'un script. Sur l'ancien système, le débug prenait énormément de temps en raison du processus. Même si cela reste compliqué de débugger des scripts complexes, la méthode est bien plus simple.

Défis

Le principal défi a été de permettre la consultation rapide de chaque version. Les créateurs doivent pouvoir vérifier sans attendre le résultat de leur travail. Avec un langage de compilation, cela nécessiterait de fermer le jeu, de procéder aux modifications, de compiler puis de relancer le jeu afin de voir le résultat. Slayer Script est intégré dans un module qu'il est possible de charger pendant que le jeu fonctionne. Il est parfois difficile de recharger un module de façon dynamique, car toute référence à des objets du module doit être déliée avant de décharger le module, puis reliée une fois le module chargé de nouveau. Si cette procédure n'est pas respectée, le jeu ou les outils plantent.

Avec C++, la mémoire et les coûts de performances du système disposent d'un grand potentiel de base. Le but de C++ est de proposer des applications très performantes et aussi efficaces que possible. C'est un langage mature qui propose de nombreux outils pour faciliter le développement et la mesure des performances.

Un autre défi était de dissimuler les complexités de C++ pour les personnes utilisant Slayer Script. C++ est un langage qui peut être difficile à utiliser, mais en tant que langage de script, il n'est pas plus complexe qu'un autre. C'est un domaine qu'on peut encore améliorer. Cela fait partie de nos objectifs.

Nous attendons vos retours avec impatience dans le RTP de Season of the Guardian. Merci pour votre soutien, et à très vite en Aeternum.

Partager