Optimisation de Unity: comment la hiérarchie des scènes vous vole

Ainsi, vous avez optimisé les parties les plus évidentes de votre jeu. Cependant, ce n'est pas le cas. Vous avez raté un point délicat, pas tout à fait notable: l'optimisation de la hiérarchie des scènes Unity.

Et qu'est-ce qui ne va pas avec la hiérarchie? Laisse-moi te montrer quelque chose.

Lancez Unity et ouvrez votre projet de jeu. Exécutez ensuite le jeu sur l'appareil cible
et connectez-y Unity Profiler. Enregistrez quelques images pendant le gameplay.

Dans Unity Profiler, recherchez les marqueurs de profileur désagréables suivants:


N'a pas trouvé? Continuez à chercher, je suis sûr qu'il y en a au moins un.

Il peut s'agir de UpdateRendererBoundingVolumes , Physics.SyncColliderTransform ou TransformChangedDispatch .

Ils apparaîtront lorsque vous serez prêt à abandonner. Ils se produisent lorsque vous survolez déjà le bouton de fermeture du profileur.

L'avez-vous trouvé? Si oui, vous avez de la chance. Je les ai également trouvés dans l'un de mes projets précédents et j'ai découvert comment m'en débarrasser complètement. J'ai réalisé quel mal était caché en eux ...

Vous voulez découvrir les secrets des performances de la hiérarchie des scènes Unity ?

Développeur de niveau 1: Hiérarchie typique des scènes d'unité


Je me souviens encore du premier projet Unity sur lequel j'ai travaillé il y a plus de dix ans.

Je ne connaissais toujours pas vraiment la différence entre les objets du jeu et les composants.

Mais ça n'avait pas d'importance, j'ai quand même créé des jeux.

image

Une telle hiérarchie chaotique de la scène de l'unité m'était-elle familière? En fait oui, car parfois c'était bien pire. Cependant, il est curieux que le plus souvent, il soit possible de s'en sortir avec ce type de hiérarchie. Mais tu vas souffrir. Vous devrez le payer plus tard.

Heureusement, avant de commencer à développer des jeux de manière professionnelle, j'ai appris à apprécier des hiérarchies plus structurées.

La structure de qualité de la hiérarchie des scènes peut être votre meilleur ami. La structure simplifie considérablement le développement et la collaboration.

Cela ne doit pas être parfait, quoi que cela signifie. Il lui suffit d'être bon. Mais attention. C'est important.

Une hiérarchie encombrée de la scène est dangereuse, elle vous posera des problèmes, car il est très peu probable que vous remarquiez directement ses effets secondaires.

Un fantôme effrayant vous hantera, vous ralentira et vous tirera en arrière. Parfois, vous regarderez en arrière, mais il n'y aura rien derrière. Par conséquent, vous vous habituerez à vous déplacer lentement.

Au fil des ans, j'ai appris à diagnostiquer ces effets secondaires. Le principal problème est que les effets secondaires d'une hiérarchie chaotique ne sont pas si faciles à suivre.

Vous verrez le profileur, mais vous ne saurez pas ce que signifient les marqueurs. Leurs noms sont souvent mystérieux ... quels secrets gardent-ils? Il n'y a qu'une chose à savoir: les mystérieux marqueurs nous disent quelque chose qui mérite d'être exploré.

Lorsque nous discutons de l'amélioration de la structure des scènes, nous entendons généralement une meilleure compréhension et une réduction des coûts de support. Mais tout le monde oublie la performance.

Analysons la hiérarchie des scènes ci-dessus. Il contient 2 000 sphères tournantes imbriquées les unes dans les autres .

Qu'en dira le profileur? Voyons voir.

image

Optimisation de la hiérarchie de scène Unity: présentation du profileur de hiérarchie

Très mauvaise performance pour un préfabriqué simple et un script de rotation appliqué à une sphère régulière. Comme vous pouvez le voir, Physics.SyncColliderTransform et UpdateRendererBoundingVolumes occupent une grande partie du budget de temps de trame. Mais ne terminons pas l'analyse à ce sujet, car je suis très curieux de ce cas.

Allons plus loin.


Détails du profileur de hiérarchie

Voici la réponse à la question de l'article.

Les hiérarchies non optimisées provoquent deux gros problèmes dans Unity.

  • Des hiérarchies profondes empêchent le système de travail de fonctionner efficacement en parallèle
  • Les hiérarchies imbriquées déclenchent des goulots d'étranglement dans certains sous-systèmes Unity.

N'oubliez pas, car il s'applique à tous les types d'objets dynamiques , et notamment aux interfaces utilisateurs.

Pour référence: je travaille sur Threadripper avec 16 cœurs physiques et 32 ​​threads. Savez-vous combien d'entre eux travaillent efficacement dans ce projet? Un seul.

Inutile de dire que les performances du jeu en souffrent. Et si vous essayez de corriger la situation en comprenant tous ces noms mystérieux, vieillissez prématurément.

Que ferait un développeur de niveau 2 avec 2 000 objets?

Développeur de niveau 2: Hiérarchie optimisée de la scène Unity


Un développeur Unity de niveau 2 sait que les transformations enfants ont un prix. Il sait également que le prix dans ce cas est le milliseconde de temps CPU. Ou les heures de travail supplémentaires passées par le développeur pour résoudre ce problème.

Demandez-vous: le budget de temps CPU est-il suffisant pour payer une hiérarchie aussi étendue?

De quel domaine de votre jeu prenez-vous ces millisecondes?

Cela devra-t-il réduire le nombre de belles particules? Ou le nombre de monstres qu'un joueur doit combattre? J'espère que vous n'aurez rien à faire, mais mieux ...

Créez des hiérarchies de scènes efficaces et détruisez celles qui ne sont pas optimales.

La raison pour laquelle l'imbrication complexe d'objets enfants dérobe les ressources du jeu est simple: chaque changement de transformation affecte les enfants, et éventuellement les parents de frères et sœurs.

Lorsque vous modifiez la position, la rotation ou l'échelle d'un objet, Unity raconte de nombreux aspects. Le moteur le fait de manière autonome afin que vous puissiez vous concentrer sur le jeu. C'est génial, mais si vous ne le savez pas, le prix peut devenir astronomique.

Quelle est la solution? Gardez les choses simples et respectez les règles d'or d'une hiérarchie de scènes Unity propre:

  • Pas plus de 50 enfants au total par objet de jeu
  • Pas plus de 4 niveaux d'imbrication sur un objet de jeu.

N'est-ce pas facile? Le développeur de niveau 2 crée autant que possible des hiérarchies plates de scènes d'unité.

Jetez un œil à l'image ci-dessous. Le même nombre d'objets, mais cette fois structuré en une hiérarchie plate.


Les économies sont énormes.

Mais plus facile à dire qu'à faire, n'est-ce pas? La séparation et la destruction des relations entre les objets sont laborieuses, sujettes aux erreurs et longues.

Que ferait un développeur de niveau 3?

Développeur de niveau 3: outil de hiérarchie FAP


Un bon développeur Unity fait le travail. Un grand développeur Unity fait le travail plus rapidement et plus précisément. Mais comment réussit-il? Avec l'aide d'outils. Étant donné que la seule hiérarchie bon marché est la hiérarchie vide, pour évaluer le jeu, vous devez répondre aux questions suivantes ...

Quelle est la complexité de vos hiérarchies?

On peut répondre à cette question en analysant méthodiquement les hiérarchies et en leur attribuant une note numérique.


Quelles formules mathématiques sont nécessaires pour calculer cette estimation? Heureusement, aucun. J'ai tout fait pour toi. J'ai écrit un prototype d'outil pour analyser et reconnaître automatiquement les goulots d'étranglement dans votre hiérarchie sur la base des règles d'or ci-dessus.

J'ai appelé ce Fabulous Advanced Profiling Hierarchy Tool . Lancez le jeu. Rendez-vous à un moment intéressant. Ouvrez l'outil et laissez-le faire le reste.


L'outil vous donnera une note entière. Une fois que vous connaissez le score, vous saurez quoi faire ... Ou pas?

Parce que je vous donne non seulement cet outil, mais aussi un script supplémentaire qui vous permet de renforcer votre capacité à éliminer les problèmes de hiérarchies. Je vous donne la puissance d'un simple script DetachGameObject.cs .

Il est rare de trouver un script de 27 lignes, ce qui permet d'améliorer les performances en si peu de temps. Son travail est simple: lors de l'exécution du programme, il déplace les objets de jeu lourds et embarqués à la racine de la hiérarchie des scènes. De ce fait, vous profitez de hiérarchies structurées au moment de la conception et obtenez d' énormes gains de performances lors de l'exécution .

Il y a une forte probabilité que vous puissiez le faire pour une grande partie de votre hiérarchie, qui pour la structuration a beaucoup d'imbrication.

Vous pouvez télécharger l'outil et le script à la fin de l' article d'origine .

Source: https://habr.com/ru/post/fr481510/


All Articles