Game teardown

Rendu à l'échelle: Stratégies efficaces pour le comptage massif d'objets

MATTHEW WOJTECHKO / MEGA CAT STUDIOSLead Game Developer
Aug 14, 2026
Scène de quartier de Backyard Baseball 2026 par Mega Cat Studios et Playground Productions
Cette page a été traduite automatiquement pour faciliter votre expérience. Nous ne pouvons pas garantir l'exactitude ou la fiabilité du contenu traduit. Si vous avez des doutes quant à la qualité de cette traduction, reportez-vous à la version anglaise de la page web.

C'est le quatrième billet d'une série écrite par Mega Cat Studios. Dans ce billet, Matthew Wojtechko examine les leçons de performance tirées de l'utilisation à la fois d'URP et HDRP, et explore des solutions avancées comme les implémentations personnalisées de Batch Renderer Group pour le rendu de l'herbe, où chaque milliseconde compte.

Lisez les autres articles de blog de cette série:

Rendre des milliers d'objets sans déposer de cadres est un défi constant. Les paysages urbains denses et les paysages tentaculaires sont devenus la marque de fabrique du jeu moderne. Mais si ces vues sont à couper le souffle pour les joueurs, elles peuvent être un casse-tête pour les ingénieurs chargés de maintenir un 60 images par seconde (FPS) fluide.

Et si vous ciblez des plateformes avec moins de puissance, comme les appareils mobiles ou non connectés, ce ne sont pas seulement ces vues qui posent problème. N'importe quel environnement peut facilement faire tourner le matériel s'il comprend n'importe quel niveau de détail.

Nous avons poussé les capacités des systèmes de rendu d’Unity depuis des années maintenant dans Mega Cat Studios, et il a fallu chaque tour dans notre sac pour obtenir le style artistique attachant de Backyard Baseball et fonctionner pour PC et consoles, sans sacrifier l’intention artistique.

Dans ce billet, nous allons explorer des techniques comme le batching statique et les textures d’animation de sommets, et partager certains des problèmes que nous avons rencontrés dans notre plus grand titre 3D à ce jour, le tout dans le but de vous aider à garder votre fréquence d’images fluide alors que le nombre d’objets explose.

Même un environnement d'apparence trompeuse peut être un défi à rendre sur du matériel bas de gamme.
Même un environnement d'apparence trompeuse peut être un défi à rendre sur du matériel bas de gamme.

Rechercher ce qui cause des problèmes de rendu, puis optimiser

Le rendu est une collaboration entre votre CPU et votre GPU.

« Le CPU est l’entraîneur, et le GPU est l’athlète. Le CPU appelle la pièce et le GPU les réalise », explique Liam Dudas, ingénieur en optimisation chez Backyard Baseball.

Parfois, le travail du GPU est plus long que d'autres tâches. Les maillages complexes, les shaders et l'éclairage peuvent provoquer des ralentissements, et la meilleure façon d'améliorer les performances est de réduire leur complexité en demandant à l'artiste d'optimiser ces actifs.

D’autres fois, ce n’est pas ce que le CPU demande au GPU, mais comment il le demande.

Le processeur exécute-t-il ses instructions de manière optimale ? Est-ce que ça prend beaucoup de temps de trouver quoi dessiner, faire tourner le CPU de ses pouces au lieu de faire tourner le reste du jeu ? Le CPU fournit-il des informations de manière redondante ? Un bon entraîneur peut inspirer un retour inattendu de son équipe, mais quand il s’agit d’optimisation, nous ne pouvons pas seulement amener ces systèmes à « faire plus d’efforts ». Il s’agit de comprendre l’information qu’ils traitent et comment ils la communiquent.

Cela revient à optimiser les appels de tirage que le processeur passe au GPU. Plus nous pouvons rassembler de travail en un seul appel, mieux c'est, surtout quand il y a des dizaines de milliers d'objets à rendre.

Il existe de nombreuses astuces pour y parvenir – mais un mot de prudence avant de le faire.

Ne vous contentez pas d’optimiser bon gré mal gré, pour rien de plus que le frisson du code astucieux. Toujours comparer d'abord. Trouvez où votre projet souffre le plus. La première question que vous devriez toujours poser: Votre goulot d'étranglement est dans le CPU ou le GPU ?

Certaines des solutions de ce billet augmentent la vitesse du processeur, d'autres la vitesse du processeur. Vous ne voulez pas vous laisser emporter par l'optimisation d'un processeur alors que l'autre est réellement la source de vos pics de trame. Une fois que vous avez décidé si votre jeu est lié au processeur ou au GPU, cherchez quelle procédure prend le plus de temps, puis optimisez-la. Le guide Unity est un excellent point de départ, qui comprend un organigramme pratique qui fournit des conseils sur le processus souvent mystérieux du profilage.

« Je dois faire beaucoup de profilage », dit Liam. « Je peux dire quand le CPU fait beaucoup, et le GPU non, et vice versa. Vraiment, notre pire goulot d’étranglement a été les deux à des moments différents. »

Nous avons inclus une flopée de nos ressources préférées à la fin de ce billet pour vous aider dans votre propre parcours de profilage.

Et avec cet avertissement écarté, explorons les optimisations.

Simplifier et abattre

Lors du rendu, nous devons déterminer quels maillages rendre et où.

Plus nous avons de maillages et plus nous avons besoin d'appels de tirage, plus le CPU doit continuer à trouver quoi faire pendant que le GPU attend son prochain travail.

Nous pourrions accélérer le processus en rendant moins de maillages. Par exemple, vous pourriez échanger des mailles complexes avec des imposteurs, des panneaux publicitaires ou des versions low-poly; ou vous pourriez briser un monde tentaculaire en niveaux plus petits avec moins à rendre à la fois. Ce sont des solutions éprouvées que vous devriez utiliser quand vous le pouvez, mais elles limitent le niveau de détail dans vos environnements.

Une optimisation qui évite cela, et qui est simple à mettre en œuvre, est l’occlusion culling, où la caméra vérifie ce qui se trouve dans son champ de vision et évite de restituer ce que le joueur ne peut pas voir. Cela permet de gagner du temps au prix d'une utilisation accrue de la mémoire, mais cela vaut souvent la peine dans les environnements avec de nombreux maillages fixes, comme les pièces détaillées d'un immeuble de bureaux. Cette optimisation est un standard de l’industrie, mais elle ne suffit souvent pas à elle-même.

Lot statique

Une autre façon de limiter le nombre de mailles que nous rendons sans sacrifier la variété est de les combiner en une seule maille.

Vous pouvez le faire vous-même manuellement. Ou, tant que les mailles partagent le même matériau, Unity peut le faire pour vous dans un processus appelé batching. Définissez un objet de jeu sur statique, et Unity mettra automatiquement en lots tous les maillages avec le même matériau ensemble pour réduire les appels de tirage. Utilisez cette option sur tout ce qui reste statique, comme les arbres et les murs.

Cela réduit considérablement l'utilisation de la RAM et les frais généraux du processeur, permettant au GPU de restituer plus de contenu à la fois. Mais gardez à l'esprit que plus de mémoire GPU sera utilisée pour stocker les maillages combinés.

Le batching statique est souvent notre processus d'optimisation clé n°1, particulièrement pour le Backyard Baseball. L'utilisation du système de batching d'URP est simple, le plus difficile est donc de trouver comment utiliser le moins de matériaux possible sur autant de modèles que possible. Cet exercice d'équilibriste est la raison pour laquelle nous avons certains des chats les plus créatifs dans nos équipes d'optimisation et d'art.

Instancing GPU

C'est le bon moment pour commencer à distinguer une chose... d'une instance de cette chose.

Disons que vous avez un maillage. Un maillage est un atout. Et son matériau est un atout. Ce sont des fichiers uniques qui existent dans votre structure de fichiers. Pour chaque objet ayant une apparence 3D dans votre jeu, un maillage décrit sa forme, puis un matériau décrit l'apparence de sa surface.

Mais comme Unity simplifie ses détails, certains développeurs ne se rendent pas compte que lorsque leur jeu tourne, ils ont en fait plusieurs copies de ces choses instanciées dans leur monde de jeu. Lorsque votre joueur explore une forêt, il se déplace à travers de nombreuses copies de cet arbre stockées comme un atout dans les fichiers de son jeu.

C'est pourquoi nous avons utilisé l'instancing GPU pour le feuillage dans Backyard Baseball. Au lieu de rendre chaque copie de l'arborescence avec des appels uniques au GPU, le CPU demande au GPU de rendre tous les modèles identiques en même temps. Si vous ne faites pas attention, cela pourrait faire en sorte que chaque arbre de la forêt semble identique. Mais, avec certains paramètres efficaces dans le shader du matériau, par exemple, une valeur pour personnaliser la couleur des feuilles, vous pouvez passer au GPU un modèle et un matériau, avec les couleurs uniques pour chaque arbre, plutôt que de demander chaque arbre individuellement.

Le feuillage est souvent un bon candidat pour l'instancing GPU.
Le feuillage est souvent un bon candidat pour l'instancing GPU.

Lorsque vous activez le paramètre Activer l'instance sur un matériau, vous indiquez à Unity de combiner dans un même appel de tirage différentes instances matérielles qui utilisent le même matériau. C'est une excellente façon d'équilibrer à la fois la variation et la performance dans vos mailles. Et, contrairement au batching statique, l'instancing GPU peut être utilisé sur des objets de jeu qui se déplacent dans votre scène, vous n'êtes donc pas limité à optimiser uniquement des choses comme les murs et les arbres, mais aussi des accessoires comme les débris d'une épave ou des fournitures de bureau.

Textures d'animation vertex

Le batching statique et l'instancing GPU sont deux manières différentes d'optimiser les maillages et les matériaux. Mais parfois, ce sont les animations qui sont à l’origine du goulot d’étranglement. Prenons l'exemple simple de forêt de tout à l'heure. Maintenant, imaginez que ses branches et ses feuilles se balancent dans la brise, le tout avec une animation unique et naturelle. Exécuter 10 000 processus d'animation uniques de la manière habituelle ne va tout simplement pas couper. Le pauvre CPU sera celui qui halète pour de l’air si vous n’y prenez pas garde !

Une astuce consiste à utiliser des textures d'animation de sommet (TVA). Une TVA détourne la puissance de traitement d’un GPU pour s’essayer à l’animation.

Pour David Chávez Armenteros, développeur senior chez Mega Cat Studios, utiliser la TVA pour simuler une foule était l'une de ses implémentations graphiques préférées à optimiser.

« En utilisant des rendus maillés écorchés standard avec l’Animator, vous ne pouvez rendre que quelques dizaines de personnages avant que les performances ne commencent à baisser », dit-il. « Mais en combinant la TVA avec l’intégration du GPU, vous pouvez pousser des milliers d’entités animées à l’écran à la fois. »

Avec la TVA, chaque sommet de maille lit sa position animée à partir d'une texture chaque cadre. Pour ce faire, nous encodons les données de position et de rotation en valeurs RGB . Ensuite, un shader spécial lit tous les pixels dans une texture pour déterminer comment déplacer tous les sommets.

C'est ce qu'on a utilisé pour le gazon balançant du Baseball Backyard. C’est un moyen efficace de créer des animations fluides, mais n’oubliez pas que c’est uniquement visuel : le collisionneur ne change pas. Cela rend la TVA idéale pour les scénarios où le mouvement est essentiel mais pas la détection précise des collisions.

Dans Backyard Baseball, l'herbe se balance est obtenue grâce à des textures d'animation de sommet (TVA).
Dans Backyard Baseball, le balancement de l'herbe est obtenu grâce aux textures d'animation de sommet (TVA).

Et chaque optimisation s'accompagne d'un compromis. La TVA libère le processeur, au prix d'une charge supplémentaire sur la RAM. Tout cela doit être mis en balance avec d'autres solutions de rendu dans le jeu.

« La chose la plus intense dans le système a été d’équilibrer l’utilisation de la mémoire et les calculs d’abattage basés sur le GPU pour faire face aux ressources limitées des appareils non connectés », explique Jordan Latta, artiste technique pour Backyard Baseball.

URP vs HDRP

Le premier choix que vous faites lors de l'optimisation graphique est le pipeline de rendu que vous choisissez lorsque vous démarrez un projet. Le pipeline de rendu universel (URP) a de bonnes performances de base et est un must absolu pour les appareils mobiles et non connectés. Le pipeline de rendu haute définition (HDRP) cible les visuels haute fidélité et offre un comportement d'instanciation plus spécialisé.

Généralement, nous recommandons d'utiliser URP sur HDRP dans Unity Vous avez peut-être un cas d'utilisation qui nécessite HDRP, mais nous sommes motivés par ce principe simple: Gardez votre rendu aussi efficace que possible.

HDRP vous offre des fonctionnalités haut de gamme, mais si vous savez que vous ne visez pas une fidélité visuelle réaliste, nous vous recommandons de passer le cap.

Plus d'astuces d'optimisation

Parfois, le problème avec des milliers d’objets à l’écran n’est pas du tout le rendu. C’est votre propre code. Dans ces cas, voici quelques astuces que vous pouvez employer:

  • Consolidez des milliers de boucles de mise à jour en une seule. Au lieu de donner à chaque GameObject ses propres MonoBehaviors, consolidez-les en un seul afin qu'ils partagent la même fonction Update. Un gestionnaire centralisé permet d'éviter des milliers de boucles de mise à jour individuelles.
  • Au lieu de tout exécuter sur le même thread, utilisez le multithreading. Explorez si le système de travail et le compilateur Burst pourraient être de bonnes options pour votre jeu.
  • Encaisser les caches. Au lieu de saisir la caméra principale ou le Transform d’un GameObject à chaque image, mettez-les en cache une fois, puis réutilisez cette référence. Tarodev démontre l'amélioration des performances et explique également ces autres optimisations.

Peut-être que le meilleur boost de rendu que vous pouvez obtenir pour votre prochain projet est d'utiliser la dernière version LTS d'Unity. Unity 6.3 LTS bénéficie d'une foule d'améliorations, y compris des optimisations pour améliorer les performances.

Pour Backyard Baseball, notre victoire la plus simple et la meilleure en optimisation était notre utilisation des textures.

Il existe quelques façons sournoises d'utiliser accidentellement le double des textures dont vous avez besoin:

  • Shaders: Si un shader utilise une texture à deux occasions différentes, et qu'il le fait sans partager la même référence, il peut charger la texture à plusieurs endroits en mémoire.
  • Scripts : De même, différentes zones de votre base de code peuvent finir par charger la même texture via différentes références.
  • Version Control : Lorsque deux développeurs ajoutent le même fichier à leur branche locale, les deux fichiers sont parfois conservés lorsque les branches fusionnent, ce qui prend de l'espace de stockage qui est simplement redondant.

Nous essayons d'être conscients de ces pièges afin de pouvoir les prévenir avant même qu'ils ne se produisent, mais être trop rigoureux ralentit le cycle d'itération rapide. C’est là que nos chats d’optimisation interviennent pour auditer les shaders, les assets et les scripts lorsque le projet entre dans les dernières phases de son cycle de développement.

Aux Mega Cat Studios, ces stratégies nous permettent de rendre des scènes qui étaient impensables il y a quelques années à peine.

Pour nous, le rendu est fondamentalement magique: nous pouvons créer tout ce que nous pouvons imaginer en temps réel, mais seulement après avoir étudié attentivement les textes secrets (documentation Unity, articles de blog, tutoriels YouTube). Heureusement pour nous, nous avons quelques sorciers dans notre personnel qui n'aiment rien de plus que de plonger dans cette documentation et de partager le butin avec l'équipe.

Et bien sûr, ceux qui en profitent vraiment, ce sont nos joueurs. Nous espérons que les fans apprécieront d'explorer Ba ckyard Baseball s ans même s'arrêter pour considérer combien de sang, de sueur et de magie ont été mis pour rendre ce monde réel.

En savoir plus