Warning: Undefined array key "hostname" in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-admin/includes/class-wp-filesystem-ftpext.php on line 98
Qu'est-ce que la compilation de shaders et comment elle est devenue le fléau des jeux sur PC modernes, expliqué en 5 cartes - En Cause

Qu’est-ce que la compilation de shaders et comment elle est devenue le fléau des jeux sur PC modernes, expliqué en 5 cartes

Qu’est-ce que la compilation de shaders et comment elle est devenue le fléau des jeux sur PC modernes, expliqué en 5 cartes

Le problème de la compilation des shaders : expliqué

Que sont les shaders ?

  • Un shader est un programme qui calcule divers attributs des graphiques rendus. Il s’agit essentiellement d’un ensemble d’instructions que le processeur envoie au GPU et qui affectent tous les pixels de l’écran et transforment la géométrie ou les caractéristiques visuelles des objets et des matériaux à l’écran.
  • Pour avoir une idée générale du fonctionnement des shaders, vous pouvez regarder une vidéo YouTube courte mais informative réalisée par l’ingénieur logiciel senior de ProbablyMonsters, Anne McLaughlin alias TheHappieCat.

Création d’un shader de profondeur d’eau dans Unreal Engine 4 (Source : Ben Cloward)

  • Les jeux vidéo utilisent des dizaines de shaders de différents types et complexité par image – vertex, pixel, tessellation, ray tracing, etc. – pour calculer et contrôler des paramètres tels que la position, la couleur, l’éclairage, la réflectivité et les coordonnées de la texture.
  • Les moteurs modernes, notamment Unreal et Unity, disposent d’outils basés sur les nœuds pour créer des shaders sans code. Cela permet aux développeurs de définir l’apparence finale de différentes surfaces et effets en temps réel en visualisant les relations entre les opérations, en appliquant certains paramètres, puis en transformant les graphiques en shaders compilés.

Exemple de graphique de nœuds de la pile principale dans Unity

Qu’est-ce que la compilation de shaders et pourquoi est-elle différente sur consoles et PC ?

  • Pour que le matériel puisse « comprendre » le code écrit par l’homme, il doit être traduit en code binaire. En termes simples, c’est ce qu’on appelle la compilation, et c’est pourquoi les shaders doivent être compilés pour fonctionner sur un GPU spécifique.
  • Lorsqu’ils créent un jeu pour consoles, les développeurs savent exactement ce qui se trouve à l’intérieur de chaque Xbox Series X, PlayStation 5 ou autre appareil. Les shaders sont donc précompilés et peuvent être livrés avec le jeu.
  • Le PC de chaque joueur, en revanche, peut avoir sa propre configuration et sa propre combinaison de CPU, de cartes graphiques et d’autres matériels. Et c’est là que les principaux problèmes se posent.

CPU et GPU de la PlayStation 5

L’intérieur de la PS5 (Source : PlayStation)

  • Dans la plupart des cas, les shaders des jeux PC sont compilés à la volée, ce qui sollicite davantage le processeur. Mais, comme l’explique le célèbre YouTubeur technologique Linus Sebastian, « Une fois qu’un shader est recompilé, il est sauvegardé sur votre SSD ou sur votre disque dur. Ainsi, votre processeur n’aura plus jamais à effectuer ce travail supplémentaire. »
  • La mauvaise nouvelle, c’est que si le joueur change la configuration de son PC ou met à jour les pilotes de son GPU, les shaders devront être recompilés.
Lire  Le Prince William partage la "force intérieure" de la Reine, alors que Kate et lui "cachent leur désarroi" après le décès de Spare.

Elden Ring bégaie sur PC

Des problèmes de compilation des shaders entraînent des baisses de FPS dans Elden Ring sur PC (Source : Digital Foundry)

Pourquoi la compilation des shaders provoque-t-elle des bégaiements ?

  • Le stuttering est un effet causé par des retards entre les images. Il en résulte un gameplay laggy et inconfortable, parfois même si les spécifications de votre PC répondent à toutes les exigences du système.
  • De nombreux problèmes peuvent entraîner des bégaiements, mais la compilation des shaders est probablement le problème le plus courant dans les titres modernes. Si les shaders ne sont pas précompilés, à chaque fois que le joueur rencontre un nouvel objet ou un nouvel effet, le jeu peut bégayer pendant que le shader est en train de charger et de rendre une scène particulière.
  • C’est pourquoi rejouer le même niveau ou retourner au même endroit après que tous les shaders aient été compilés vous donnera une expérience beaucoup plus fluide et stable.

Bégaiement en Tchernobylite

Traverser deux fois le même endroit dans Chernobylite (Source : Hardware Lab)

  • Pour éliminer ou minimiser les bégaiements, un nombre croissant de jeux proposent aujourd’hui aux joueurs de compiler les shaders dans le menu principal lors du premier lancement. Cela prend du temps – de quelques minutes à quelques dizaines de minutes – mais permet généralement de résoudre le problème.
  • Comme le dit Alex Battaglia de Digital Foundry l’a souligné dans une vidéo sur les problèmes liés aux ports PC, les shaders peuvent également être compilés de manière asynchrone. Cela augmente la charge du processeur, mais permet aux shaders d’être compilés en arrière-plan ou pendant le processus de chargement.

Compilation de shaders pour Atomic Heart

Construction des shaders lors du premier lancement d’Atomic Heart

Unreal Engine et DX12 sont-ils la racine du mal ?

  • Si vous regardez les titres qui ont des problèmes de compilation de shaders, la plupart d’entre eux sont faits avec Unreal Engine 4. Le moteur d’Epic Games est sans aucun doute un excellent cadre de développement, mais la tendance générale est claire.
  • La version PC de Le Protocole Callisto est l’un des exemples les plus tristement célèbres de jeux UE4 mal optimisés de ces dernières années. Au lancement, il souffrait de bégaiements importants qui le rendaient presque injouable.

The Callisto Protocol : des bégaiements sur PC

Bégaiements massifs dans Callisto Protocol dus à des problèmes de compilation de shaders (Source : Digital Foundry)

  • Le problème principal est la façon dont les shaders sont compilés dans UE4. Le moteur permet d’éviter les bégaiements en mettant en cache les shaders à l’aide de l’outil Pipeline State Object (PSO) Caching. Il crée une liste de tous les shaders utilisés dans le projet et accélère le processus de compilation lorsqu’ils apparaissent pour la première fois dans le jeu.
Lire  La famille royale en direct : Meghan Markle suscite des craintes quant à la possibilité qu'elle détruise la firme en relançant son blog.

Comment fonctionne la mise en cache PSO dans Unreal Engine 4

Les développeurs doivent exécuter leur build UE4 pour générer les shaders utilisés au moment de l’exécution et ensuite appliquer un fichier spécial créé par la mise en cache PSO.

  • Mais cela ne résout malheureusement pas tous les problèmes. En tant que Hi-Fil Rush Kosuke Tanaka, principal programmeur graphique, a expliqué à PC Gamer : « UE4 ne tient pas compte de certains cas tels que certaines combinaisons de shaders d’éclairage, les shaders informatiques, Niagara VFX, et ceux-ci peuvent encore causer des problèmes. »
  • Les API graphiques modernes, DirectX 12 de Microsoft et Vulkan du groupe Khronos, constituent un autre problème majeur. Contrairement à leurs anciennes versions, elles exigent plus d’attention et de travail de la part des développeurs. C’est une arme à double tranchant : les développeurs peuvent utiliser les nouvelles fonctionnalités de ces API pour améliorer les performances et les visuels, mais la nature de bas niveau de DX12 et Vulkan nécessite plus de contrôle manuel.
  • Bien que les API graphiques modernes puissent être des outils puissants entre de bonnes mains, elles sont beaucoup plus difficiles à utiliser (puisque la plupart des studios ne peuvent toujours pas gérer correctement plusieurs cœurs de CPU). Cela peut donc entraîner une mauvaise optimisation, en particulier lorsque les développeurs ne prêtent pas beaucoup d’attention à la compilation des shaders et à d’autres problèmes au préalable.

Il est temps que les développeurs traitent mieux les portages PC et les joueurs

  • Presque chaque fois qu’un nouveau titre à gros budget sort sur PC, il est confronté à des problèmes d’optimisation, qu’il s’agisse de bégaiements, d’anomalies visuelles, de bugs ou de plantages. Bien sûr, tous les lancements ne sont pas aussi bâclés que Cyberpunk 2077 sur les consoles de dernière génération, mais la tendance générale est déprimante.
  • Le problème des bégaiements est bien plus complexe et ne peut être résolu d’un simple clic. Cependant, les consommateurs ont tout à fait le droit d’être en colère lorsque les éditeurs AAA facturent leurs jeux 70 $ mais les livrent dans un état qui ruine parfois toute l’expérience.
  • Selon Digital Foundry, la compilation des shaders ne devrait jamais être liée à l’image en cours de rendu pour l’affichage, car « les jeux bégaieront férocement pour tous les utilisateurs, quel que soit leur disque dur, si les shaders sont configurés pour être compilés au moment du rendu ».
  • Il est également temps pour tous les développeurs dont le titre est susceptible de présenter ces problèmes d’activer la précompilation des shaders par défaut. Les joueurs doivent pouvoir l’annuler à tout moment et commencer à jouer immédiatement, mais ils doivent également être avertis de l’impact négatif possible sur les performances de l’annulation de ce processus afin qu’ils puissent y revenir plus tard.
Lire  Étrange répétition de minuit pour le couronnement du roi Charles

  • C’est quelque chose que les utilisateurs demandent sur Reddit et les forums depuis des mois. La précompilation, ainsi qu’un meilleur travail d’optimisation, peuvent éviter aux studios de se voir attribuer une note « Mostly Negative » sur Steam au lancement, et d’essayer de regagner la confiance des joueurs avec des patchs et des correctifs rapides.
  • La transparence et une meilleure communication, où les créateurs et les éditeurs de jeux tiennent les utilisateurs informés de tous les problèmes et essaient de rendre leur expérience aussi agréable que possible, devraient être la nouvelle norme. Pratiquement personne n’aime deviner si The Last of Us ou n’importe quel autre titre attendu les laissera passer le processus de construction des shaders ou se plantera après avoir payé 70$.
  • Aussi bien que Anneau d’Elden c’est triste de voir que FromSoftware n’a toujours pas réglé le problème du stutter plus d’un an après le lancement (et qu’il ne le réglera probablement jamais à 100%). Et ce qui est amusant, c’est que le jeu est beaucoup plus fluide sur Steam Deck. Certes, le matériel est fixe, contrairement aux PC classiques, mais Valve a le mérite d’avoir trouvé une solution en pré-cachant et en pré-compilant les shaders sur ses serveurs.
  • C’est donc aussi à Epic Games, Microsoft et d’autres entreprises d’améliorer leurs moteurs et leurs outils pour aider les développeurs à mieux optimiser leurs produits. Sinon, le jeu sur PC risque de devenir une expérience épouvantable et désagréable.

Des bégaiements dans la mise à jour next-gen de The Witcher 3 sur PC

Des bégaiements aléatoires dans la mise à jour next-gen de The Witcher 3 sur PC (Source : Neon Knight)


Vous avez une histoire à raconter ? Contactez-nous à l’adresse suivante [email protected]

À propos de l'auteur :

Joe Pezzo
Joe Pezzo

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/shader-compilation-stutter.jpg): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/03/ue-water-shader.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/03/unity-shader-node.jpg): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/inside-ps5.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/eldern-ring-stutter.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/chernobylite-stuttering.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/ah-shader-compilation.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/callisto-protocol-stutter.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/pso-caching-ue4.jpg): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Warning: getimagesize(https://gameworldobserver.com/wp-content/uploads/2023/04/witcher-3-stutter.gif): Failed to open stream: no suitable wrapper could be found in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/media.cls.php on line 860

Fatal error: Uncaught ErrorException: md5_file(/home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/cache/ls/css/c278894fc67a6f0a23c463b43aba622d.css.tmp): Failed to open stream: No such file or directory in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimizer.cls.php:149 Stack trace: #0 [internal function]: litespeed_exception_handler(2, 'md5_file(/home/...', '/home/clients/5...', 149) #1 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimizer.cls.php(149): md5_file('/home/clients/5...') #2 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimize.cls.php(843): LiteSpeed\Optimizer->serve('https://encause...', 'css', true, Array) #3 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimize.cls.php(334): LiteSpeed\Optimize->_build_hash_url(Array) #4 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimize.cls.php(264): LiteSpeed\Optimize->_optimize() #5 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/class-wp-hook.php(324): LiteSpeed\Optimize->finalize('<!DOCTYPE html>...') #6 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/plugin.php(205): WP_Hook->apply_filters('<!DOCTYPE html>...', Array) #7 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/core.cls.php(456): apply_filters('litespeed_buffe...', '<!DOCTYPE html>...') #8 [internal function]: LiteSpeed\Core->send_headers_force('<!DOCTYPE html>...', 9) #9 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/functions.php(5471): ob_end_flush() #10 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/class-wp-hook.php(324): wp_ob_end_flush_all('') #11 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters(NULL, Array) #12 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/plugin.php(517): WP_Hook->do_action(Array) #13 /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-includes/load.php(1304): do_action('shutdown') #14 [internal function]: shutdown_action_hook() #15 {main} thrown in /home/clients/5b0ebaad580f036b98077d4f120ff4c5/sites/encause.fr/wp-content/plugins/litespeed-cache/src/optimizer.cls.php on line 149