Il y a deux mots précis qui sont entrés dans notre vocabulaire ces deux dernières années lorsqu'il s'agit d'analyser un jeu vidéo d'un point de vue technique : shader e bégaiement. À peine avant 2020, ces deux concepts ont été associés aux productions de jeux vidéo, sauf dans des analyses extrêmement techniques.
Chaque avancée dans le domaine du codage du code source ou des moteurs graphiques s'accompagne également de la découverte de nouvelles limites des méthodes de programmation actuelles, de sorte que certains problèmes jamais abordés jusqu'à présent remontent à la surface ; jusqu'à ce que la technologie aille aussi loin, de nombreux problèmes actuels n'étaient pas calculables et prévisibles. La course à la meilleure résolution, à la propreté des détails et au réalisme en termes de luminosité, d'ombres et de contrastes a donné naissance à de nouvelles difficultés avec lesquelles les développeurs doivent lutter pour optimiser leur produit.
Dans notre spécial nous parlerons de la façon dont l'augmentation des détails graphiques a entraîné les problèmes d'optimisation constatés dans les productions récentes, les processus de calcul du GPU et du CPU devenant de plus en plus complexes et difficiles à digérer, compromettant la fluidité dans le jeu avec des hoquets d'image perceptibles et des temps de chargement de plus en plus longs.
L'importance des Shaders
Pour approfondir ce sujet, il faut commencer par les bases, mais expliquées avec des mots simples ; ainsi , qu'est-ce qu'un shader ? Un shader est un ensemble de commandes, ou plutôt d'instructions, qui créent ensemble un petit programme qui affecte l'affichage d'une image à l'écran. Plus précisément, il s'agit d'une série d'instructions toutes exécutées en même temps pour chaque pixel individuel de l'écran. Essentiellement, la programmation du code d'un jeu détermine ce qui sera joué pendant que… le shader agit sur la façon dont un jeu vidéo sera reproduit.. Ce processus peut être comparé à la création d'un dessin sur papier, et une fois les formes esquissées, on passe au travail des détails et de la coloration : les shaders entrent en jeu, indiquant précisément le type de couleur, la géométrie, la luminosité, le contraste, la netteté et bien d'autres choses encore de l'objet prédéterminé.
Pour couvrir tous ces aspects, il existe différents types de shaders qui agissent dans les différentes sphères d'influence que nous venons d'énumérer : par exemple, les pixel shaders ou les ray shaders (nés avec l'avènement du raytracing) sont chargés de donner l'ordre sur la façon dont l'éclairage et la texturation apparaîtront à l'écran. Les jeux vidéo, comparés à d'autres programmes, nécessitent une plus grande puissance de calcul car le contenu graphique peut être extrêmement détaillé et calculé en temps réel, de sorte que chaque pixel recevra des dizaines et des dizaines d'instructions. À une résolution de 2880×1800 à 60 fps, on peut atteindre jusqu'à 311040000 calculs par seconde, une valeur qui double et dans certains cas triple lorsqu'on passe à la 4K à 120 fps.
Avec la puissance des derniers CPU et GPU, le calcul de toutes les instructions est extrêmement rapide malgré le fait que, comme mentionné plus haut, le travail des pixel shaders est extrêmement complexe. Il est bien évident que plus un processeur et une carte graphique sont puissants, moins les composants sont sollicités et meilleures seront les performances graphiques et la fluidité du jeu. Bien que cela explique en partie comment fonctionne le travail derrière un dessin et une vidéo en 3D, le processus de traitement de l'image et son rendu graphique ne s'arrêtent pas là.
Du code au jeu
Une fois que les informations avec lesquelles les shaders doivent prendre en charge le processus sont esquissées, il y a une transition vers l'étape de l'analyse de la structure du jeu.API, Application programming interface, littéralement traduit par interface de programmation d'applications. Les plus utilisées , Direct3D o OpenGLsont le filtre qui traduit le langage des shaders au GPU, tout comme cela se passe dans la phase de programmation lorsqu'on passe du code source, le véritable squelette du jeu, à la conversion en code binaire afin de pouvoir jouer sur un PC. En résumé, chaque code source ou shader doit être “traduit” pour être exécuté correctement sur le matériel de référence.
Une fois la conversion effectuée, le processus de calcul est traité rapidement par le GPU (en quelques fractions de seconde pour te donner une idée) et si tu as des composants performants, cela ne se remarque absolument pas, car tout se passe sur l'écran principal ou pendant le chargement. La formulation “Loading Shader” avec une barre de progression, en revanche, est très fréquent lorsqu'on joue à des titres modernes avec des cartes graphiques plus anciennes. Ces dernières ne sont pas en mesure de traiter toutes les instructions instantanément et sont obligées de donner la priorité aux calculs à effectuer, ce qui nécessite un temps supplémentaire par rapport au chargement standard. Dans ce cas précis, il y a également un avertissement directement dans le menu principal du jeu t'informant que tu peux soit attendre que tous les shaders se chargent, soit aller de l'avant et les laisser se charger à un rythme plus tranquille pendant le jeu.
Cette introduction offre une explication à ces problèmes que l'on rencontre de plus en plus souvent dans les jeux nouvellement conçus, un grain qui n'était pas perçu il y a encore quelques années, ou du moins pas de manière aussi perceptible. Il suffit de dire qu'aux débuts de cette technologie, les commandes que l'on pouvait assigner avec les shaders étaient tout au plus une douzaine, alors que dans les productions récentes, elles dépassent largement le millier. Tout cela explique, en gros, pourquoi les problèmes graphiques que nous voyons dans les titres récents sont devenus plus apparents : l'augmentation des détails dans les jeux vidéo se traduit par un plus grand nombre de shaders sur le terrain.plus de shaders signifie plus de calculs, et parfois, plus de problèmes.
Monde ouvert contre bégaiement
Ce n'est d'ailleurs pas une coïncidence si de tels problèmes soient apparus avec les mondes ouverts de ces dernières années.en prenant pour exemple des produits du calibre de Cyberpunk 2077 ou Elden Ring, où précisément les shaders doivent travailler sur une myriade de détails. Comme ces jeux sont très vastes en termes de surface jouable, les shaders ne sont pas instantanément chargés pour toute la zone de jeu et le processus se déroule au fur et à mesure que l'on s'approche de certaines zones : si nous explorons Liurnia, notre PC ne calcule pas les shaders de Caelid à ce moment-là, mais ne le fera que lorsque nous nous approcherons de cette zone d'influence ou pendant le chargement lors d'un voyage rapide.
Cette solution n'est pas toujours pratique pour éviter les problèmes techniques, et cela change en fonction du matériel sur lequel le jeu est joué. Sur les consoles telles que la PlayStation 5 et la Xbox Series X, il est d'usage que les shaders soient déjà précompilés, ce qui élimine une grande partie du casse-tête auquel les développeurs sont confrontés lorsqu'ils optimisent toutes les combinaisons matérielles possibles sur PC.
Toute équipe de développement, lorsqu'elle travaille sur un jeu et doit l'optimiser pour les consoles, sait que le matériel est statique, c'est-à-dire que toutes les PlayStation et Xbox ont un processeur et une carte graphique spécifiques, alors que les variables GPU et CPU sur les PC sont assez nombreuses ; cela explique en partie pourquoi il y a une différence substantielle entre toutes les variantes de PC lorsqu'on joue au même jeu.
Solutions modernes
La situation de l'écran de chargement des shaders que nous avons évoquée plus haut est l'une des solutions adoptées par les développeurs pour éviter certains problèmes. En démarrant le portage d'Uncharted de l'année dernière sur un PC équipé d'une NVIDIA RTX 1060 de 3 Go et d'un Intel I7 de huitième génération, nous avons reçu un avertissement dans le menu principal indiquant que les shaders étaient en train de se charger et que démarrer le jeu avant la fin de cette opération compromettrait les performances graphiques. Cela s'explique par le fait que les développeurs ont imposé que tous les shaders soient chargés au démarrage du jeu, ce qui prolonge le temps de chargement initial, mais en même temps, une fois que c'est fait, il n'y aura pas de problème pendant l'exécution.
Une autre solution consiste à faire en sorte que les shaders ne se chargent que lorsque c'est nécessaireDans ce cas, le chargement initial sera plus léger, mais les problèmes ne sont pas complètement résolus. Ce processus peut en effet donner lieu à la bégaiement, c'est-à-dire le retard ou la perte d'images pendant l'exécution. Si la bibliothèque de shaders était correctement et proprement chargée par les développeurs, le choix de charger les shaders pendant le jeu ne devrait pas créer ces hoquets graphiques gênants, ou alors ce phénomène pourrait se produire dans des cas extrêmement rares.
Au fur et à mesure que les jeux vidéo modernes sont devenus plus complexes, même… les shaders sont devenus de plus en plus complexes et longs, de sorte que la charge de travail requise pour le traitement a considérablement augmenté.. Pour contourner le problème du bégaiement, il existe une voie intermédiaire qui consiste à charger les shaders un peu à la fois, à les cacher en partie dans le menu principal et en partie pendant les films ou le chargement, mais bien sûr, tout reste ancré au matériel sur lequel le jeu est joué, qu'il soit performant ou daté.
Quelle est la solution ?
Malheureusement, le joueur ne peut pas faire grand-chose à ce sujet, la seule option étant de laisser l'unité centrale aussi libre que possible pendant le jeu, en fermant tous les autres processus non essentiels en arrière-plan. Le travail d'optimisation est entièrement entre les mains des développeurs, et il faut de l'argent et du temps pour résoudre ces problèmes, même avec des patchs correctifs après le lancement. Nous aimerions pouvoir dire que toutes les équipes de développement consacrent d'énormes ressources à la vérification méticuleuse du jeu avant son lancement, mais la réalité est que ce domaine, comme tant d'autres, est de moins en moins central, au vu des résultats de ces deux dernières années.
Si tu penses à il y a cinq ans, le mot bégaiement était probablement connu de très peu de gens, tant les productions qui en étaient affligées étaient peu nombreuses. Les raisons en étaient multiples, et pas seulement dues à la “paresse” des développeurs, contraints par l'éditeur de publier le jeu et d'apporter des corrections dans la foulée. La programmation s'est complexifiée, les combinaisons de matériel sont devenues infinies, les délais de production ont triplé : ce triptyque de facteurs réduit considérablement le temps disponible alors que le marché est fixé sur une demande toujours plus exigeante et incessante pour rester compétitif.
À l'heure actuelle, seule une poignée de jeux laisse le choix du chargement des shaders entre les mains des joueurs. À l'instar d'Uncharted cité plus haut, Horizon Zero Dawn offre également la possibilité de les charger dans l'écran du menu principal, mais donne aussi la possibilité de les sauter si les timings prévus deviennent élevés (une situation que l'on retrouve sur les configurations bas de gamme, bien entendu). Hogwarts Legacy, quant à lui, compile la plupart des shaders au démarrage et dans le menu principal, laissant le reste à charger pendant l'exécution.
Un avenir saccadé
Les fabricants de GPU jouent également un rôle clé dans ce processus, à tel point qu'AMD et NVIDIA stockent les shaders couramment utilisés dans des dossiers spécifiques sur nos PC, mais ils sont supprimés et écrasés à chaque mise à jour. Steam essaie également de faire sa part et propose un service de stockage de cache pour tous ces jeux qui fonctionnent avec OpenGL ou Vulkan, mais si tu essayes d'y jeter un coup d'œil, ce dossier est presque toujours vide.
Malgré quelques mises en garde, cela reste principalement entre les mains des développeurs, qui, vétérans ou non, doivent venir à bout de ce problème et disposer à la fois du temps et de l'expérience nécessaires pour s'assurer que le jeu ne présente aucune criticité dans ce domaine. Étant donné le rythme de cette industrie et la course à la monétisation pour rester compétitif sur le marché, il est plus que légitime d'avoir une vision sombre de l'avenir. L'émergence du DLSS et du FSRqui, grâce à l'intelligence artificielle, permet d'améliorer considérablement le nombre d'images par seconde avec peu d'efforts “humains”, est une variante à ajouter au chaudron des problèmes qui affligent les productions modernes, qui réduisent de moitié le temps consacré au contrôle de la qualité/performance lors des tests bêta.
On espère que les moteurs graphiques deviendront plus facilement gérables pour les équipes de développement, qui sont maintenant confrontées à l'obligation d'ajouter également des “matériaux”, un processus supplémentaire qui affecte la visualisation de l'objet, ce qui crée à son tour d'autres calculs, parfois superflus, qui alourdissent inutilement le traitement. Pour l'instant, la situation nous amène à faire confiance au travail diligent des développeurs dans la phase de nettoyage, ou du moins, dans le cas de ressources limitées, à ce que le processus sous-jacent soit aussi simple et épuré que possible.