Cet article est le premier d'une série qui présente des conseils d'optimisation pour vos projets Unity. Utilisez-les comme guide pour obtenir des taux de rafraîchissement plus élevés avec moins de ressources. Une fois que vous aurez essayé ces bonnes pratiques, n'oubliez pas de consulter les autres pages de la série :
- Optimisation des performances pour les graphiques haut de gamme
- Gestion de l'utilisation du GPU pour les jeux sur PC et sur console
- Programmation avancée et architecture du code
- Performances physiques améliorées pour un jeu fluide
L'Asset Pipeline peut avoir un impact considérable sur la productivité de votre équipe et les performances de votre jeu. En travaillant avec un artiste technique expérimenté, votre équipe sera en mesure de définir et d'appliquer les formats et les spécifications des actifs pour assurer la fluidité des processus.
Ne vous fiez pas aux paramètres par défaut. Utilisez l'onglet Override spécifique à la plate-forme pour optimiser les ressources telles que les textures et la géométrie du maillage. Des paramètres incorrects peuvent entraîner des tailles de construction plus importantes, des temps de construction plus longs, ainsi que des performances médiocres du GPU et une mauvaise utilisation de la mémoire. Pensez à utiliser la fonction Préréglages pour personnaliser davantage les paramètres de base de votre projet.
Consultez ce guide pour connaître les meilleures pratiques en matière d'utilisation des ressources artistiques. Pour un guide spécifique aux mobiles, consultez le cours Unity Learn sur l'optimisation de l'art 3D pour les applications mobiles.
Dans les paramètres du lecteur, désactivez l'API graphique automatique et supprimez les API graphiques supplémentaires que vous ne prévoyez pas de prendre en charge pour chacune des plateformes ciblées. Cela permet d'éviter la génération de variantes de shaders excessives. Désactivez le paramètre Architectures cibles pour les CPU plus anciens si votre application ne les prend pas en charge.
En savoir plus sur l'API graphique.
Le passage de Mono à IL2CPP (Intermediate Language to C++) pour la gestion des scripts permet d'améliorer les performances d'exécution. Cependant, elle peut également augmenter les délais de construction. Certains développeurs préfèrent utiliser Mono localement pour une itération plus rapide, puis passer à IL2CPP pour les machines de construction et/ou les versions candidates. Reportez-vous à la documentation Optimisation des temps de construction d'IL2CPP pour en savoir plus sur la réduction des temps de construction.
remarque En utilisant cette option, Unity convertit l'ILcode des scripts et des assemblages en C++ avant de créer un fichier binaire natif (.exe, .apk, .xap) pour votre plateforme cible.
Voir l'introduction aux principes internes de IL2CPP ou consulter la page du manuel sur les options du comp ilateur pour savoir comment les différentes options du compilateur affectent les performances d'exécution.
Les projets mobiles doivent trouver un équilibre entre les fréquences d'images, l'autonomie de la batterie et l'étranglement thermique. Pensez aux images par seconde (ips).
Au lieu de repousser les limites de votre appareil à 60 images par seconde, envisagez d'utiliser 30 images par seconde comme compromis. Notez qu'Unity propose déjà par défaut 30 fps pour les mobiles.
Vous pouvez également ajuster la fréquence d'images dynamiquement pendant l'exécution avec Application.targetFrameRate. Par exemple, vous pouvez descendre en dessous de 30 ips pour les scènes lentes ou relativement statiques (comme les menus) et réserver les paramètres d'ips les plus élevés pour le jeu.
Les plateformes mobiles ne restituent pas les demi-images. Même si vous désactivez Vsync dans l'éditeur(Paramètres du projet > Qualité), il est toujours activé au niveau du matériel. Si le GPU ne peut pas rafraîchir suffisamment vite, l'image en cours sera conservée, ce qui réduira le nombre d'images par seconde.
De plus amples informations sont disponibles dans la documentation.
Unity interroge l'accéléromètre de votre mobile plusieurs fois par seconde. Désactivez-la si elle n'est pas utilisée dans votre application ou réduisez sa fréquence pour améliorer les performances.
En savoir plus sur l'accéléromètre.
Divisez vos hiérarchies. Si vos objets de jeu n'ont pas besoin d'être imbriqués dans la hiérarchie, simplifiez la parentalité.
Les petites hiérarchies bénéficient du multithreading pour rafraîchir les transformations dans votre scène. Les hiérarchies complexes entraînent des calculs de transformation inutiles et des coûts de collecte des déchets .
Voir Optimiser la hiérarchie et cette conférence Unite pour des conseils sur les transformations.
Les deux exemples ci-dessus utilisent le même modèle et la même texture - pourtant, les paramètres du haut consomment plus de cinq fois la mémoire par rapport à ceux du bas, sans que la qualité visuelle soit vraiment meilleure.
La compression des textures offre des avantages considérables en termes de performances lorsqu'elle est appliquée correctement, tels que des temps de chargement plus rapides, une empreinte mémoire plus faible et des performances de rendu considérablement accrues. Les textures compressées n'utilisent qu'une fraction de la bande passante mémoire nécessaire pour des textures RGBA 32 bits non compressées.
Consultez la liste des formats de compression de texture recommandés pour les plates-formes cibles.
Les textures peuvent potentiellement utiliser des ressources excessives, c'est pourquoi il est essentiel d'optimiser les paramètres d'importation. D'une manière générale, essayez de suivre les lignes directrices suivantes :
- Diminuer la taille maximale: Utilisez les paramètres minimaux qui produisent des résultats visuellement acceptables. Cette opération n'est pas destructive et peut rapidement réduire votre mémoire de texture.
- Utiliser des puissances de deux (POT) : Unity exige des dimensions de texture POT pour les formats de compression de texture.
- Désactiver l'option Read/Write Enabled: Lorsqu'elle est activée, cette option crée une copie dans la mémoire adressable du CPU et du GPU, ce qui double l'empreinte mémoire de la texture. Désactivez-la dans la plupart des cas, et n'activez-la que si vous générez une texture au moment de l'exécution et que vous devez l'écraser. Vous pouvez également appliquer cette option via Texture2D.Apply, en passant le paramètre makeNoLongerReadable à True.
- Désactiver les cartes Mip inutiles: les cartes Mip ne sont pas nécessaires pour les textures qui conservent une taille constante à l'écran, comme les sprites 2D et les graphiques d'interface utilisateur. Cependant, laissez les cartes Mip activées pour les modèles 3D dont la distance par rapport à la caméra varie.
En savoir plus sur les paramètres d'importation de textures.
L'atlas est le processus qui consiste à regrouper plusieurs petites textures en une seule texture plus grande. Les atlas de textures réduisent l'utilisation de la mémoire et nécessitent moins d'appels de dessin, ce qui diminue l'effort requis par le GPU.
- Pour les projets en 2D: Utiliser un Atlas de sprites(Asset > Create > 2D > Sprite Atlas) plutôt que de rendre des sprites ou des textures individuels.
- Pour les projets 3D: Vous pouvez utiliser le logiciel de création de contenu numérique (DCC) de votre choix. Plusieurs outils tiers tels que MA_TextureAtlasser ou TexturePacker peuvent également être utilisés pour construire des atlas de textures.
Combinez les textures et remappez les UV pour toute géométrie 3D ne nécessitant pas de cartes haute résolution. Un éditeur visuel vous permet de définir et de hiérarchiser les tailles et les positions dans l'atlas des textures ou la feuille de sprites.
Le Texture Packer consolide les cartes individuelles en une grande texture. Unity peut alors émettre un seul appel de dessin pour accéder aux textures emballées avec un surcoût de performance moindre.
Pour en savoir plus sur les atlas Sprite, cliquez ici.
Les modèles à haute résolution nécessitent une plus grande utilisation de la mémoire et potentiellement plus de travail pour le GPU. Par conséquent, essayez de réduire au minimum la complexité géométrique des GameObjects dans vos scènes. Sinon, Unity doit transmettre des données de vertex significatives à la carte graphique.
La meilleure pratique consiste à réduire les modèles dans votre logiciel DCC et à supprimer les polygones invisibles du point de vue de la caméra. Par exemple, si vous ne voyez jamais l'arrière d'une armoire appuyée contre un mur, le modèle ne doit pas comporter de faces à cet endroit.
Sachez que sur les GPU modernes, le goulot d'étranglement est généralement lié à la densité de polygones plutôt qu'au nombre de polygones. Essayez d'effectuer une passe artistique sur tous les actifs afin de réduire le nombre de polygones des objets éloignés. Les microtriangles peuvent être une cause importante de mauvaises performances du GPU.
En fonction de la plateforme cible, pensez à ajouter des détails via des textures haute résolution pour compenser la géométrie à faible polarité. Utilisez des textures et des cartes normales au lieu d'augmenter la densité du maillage. Réduire la complexité des pixels en intégrant autant de détails que possible dans les textures. Par exemple, vous pouvez capturer les reflets spéculaires dans la texture elle-même afin d'éviter de calculer les reflets dans le nuanceur de fragment.
Soyez attentif et n'oubliez pas de vous profiler régulièrement. En effet, ces techniques ont un impact sur les performances et peuvent ne pas être adaptées à votre plateforme cible.
Tout comme les textures, les maillages peuvent consommer trop de mémoire s'ils ne sont pas importés avec soin. Essayez ces conseils pour minimiser la consommation de mémoire de vos maillages :
- Mesh Compression: La compression du maillage peut réduire l'espace disque (bien que la mémoire au moment de l'exécution ne soit pas affectée). En même temps, la quantification du maillage peut entraîner une imprécision, c'est pourquoi il convient d'expérimenter les niveaux de compression pour voir ce qui fonctionne pour vos modèles.
- Disable Read/Write:L'activation de cette option duplique le maillage en mémoire, ce qui permet de conserver une copie du maillage dans la mémoire du système et une autre dans la mémoire du GPU. Dans la plupart des cas, vous devriez le désactiver. Dans Unity 2019.2 et les versions antérieures, cette option est cochée par défaut.
- Désactiver les rigs et les formes de fusion: Si votre maillage n'a pas besoin d'animation de squelette ou de forme de mélange, désactivez ces options.
- Désactiver les normales et les tangentes: Si vous êtes absolument certain que le matériau du maillage n'aura pas besoin de normales ou de tangentes, décochez ces options pour réaliser des économies supplémentaires.
D'autres options d'optimisation du maillage sont disponibles dans les paramètres du lecteur :
- Compression des vertex définit la compression des vertex de chaque canal. Par exemple, vous pouvez activer la compression pour tout, sauf pour les positions et les UV de la carte lumineuse. Cela permet de réduire l'utilisation de la mémoire de vos maillages pendant l'exécution.
- remarque Le réglage de la compression du maillage dans les paramètres d'importation de chaque maillage remplace le réglage de la compression du sommet. Dans ce cas, la copie du maillage en cours d'exécution n'est pas compressée et peut utiliser plus de mémoire.
- Optimiser les données de maillage supprime toutes les données des maillages qui ne sont pas requises par le matériau qui leur est appliqué (telles que les tangentes, les normales, les couleurs et les UV).
En automatisant le processus d'audit, vous éviterez de modifier accidentellement les paramètres des actifs. L'AssetPostProcessor AssetPostProcessor peut vous aider à normaliser vos paramètres d'importation ou à analyser les actifs existants. Il vous permet d'exécuter des scripts lors de l'importation de ressources et vous invite essentiellement à personnaliser les paramètres avant et/ou après l'importation de modèles, de textures, de fichiers audio, etc.
Pour en savoir plus sur l'audit des actifs, consultez le guide Comprendre l'optimisation.
Unity utilise un tampon circulaire pour envoyer les textures au GPU. Vous pouvez ajuster manuellement ce tampon de texture asynchrone via QualitySettings.asyncUploadBufferSize.
Si le taux de téléchargement est trop lent ou si le thread principal se bloque lors du chargement de plusieurs textures à la fois, ajustez ces tampons de texture. Vous pouvez généralement fixer la valeur (en Mo) à la taille de la plus grande texture que vous devez charger dans la scène.
Gardez à l'esprit que la modification des valeurs par défaut peut entraîner une pression élevée sur la mémoire. En outre, vous ne pouvez pas restituer la mémoire tampon de l'anneau au système après qu'Unity l'a allouée. Si la mémoire du GPU est surchargée, le GPU décharge la texture la plus récente et la moins utilisée, et oblige le CPU à la recharger la prochaine fois qu'il entrera dans le champ de la caméra.
Découvrez toutes les restrictions de mémoire pour les tampons de texture dans le tutoriel sur la gestion de la mémoire, et reportez-vous à la section Optimiser les performances de chargement pour voir comment vous pouvez améliorer les temps de chargement.
La carte Mip Map Streaming vous permet de contrôler quels niveaux de Mip Map doivent être chargés en mémoire. Activez-la en allant dans les paramètres de qualité de Unity(Edit > Project Settings > Quality) et cochez l'option Texture Streaming. Vous pouvez activer l'option Streaming Mip Maps dans les paramètres d'importation de textures, sous Avancé.
Ce système réduit la quantité totale de mémoire nécessaire pour les textures, car il ne charge que les cartes Mip nécessaires au rendu de la position actuelle de la caméra. Sinon, Unity charge toutes les textures par défaut.
Le Texture Streaming échange une petite quantité de ressources CPU pour économiser une quantité potentiellement importante de mémoire GPU. Il réduit également automatiquement les niveaux de Mip Map pour rester dans le cadre du budget mémoire défini par l'utilisateur.
Vous pouvez utiliser l'API Mip Map Streaming pour un contrôle plus poussé.
Le système Système d'actifs adressables simplifie la gestion des actifs qui composent votre jeu. Tout élément, y compris les scènes, les préfabriqués, les éléments textuels, etc., peut être marqué comme adressable et recevoir un nom unique. Vous pouvez ensuite appeler cet alias à partir de n'importe quel endroit.
L'ajout de ce niveau d'abstraction supplémentaire entre le jeu et ses ressources peut rationaliser certaines tâches, telles que la création d'un pack de contenu téléchargeable distinct. Les adresses facilitent également le référencement de ces ensembles d'actifs, qu'ils soient locaux ou distants.
Installez le paquet Addressables à partir du gestionnaire de paquets. Chaque bien ou élément préfabriqué du projet peut ainsi devenir "adressable".
Le fait de cocher l'option sous le nom d'un actif dans l'inspecteur lui attribue une adresse unique par défaut. Une fois marqués, les actifs correspondants apparaissent dans la fenêtre Fenêtre > Gestion des actifs > Adressables > Groupes .
Que le bien soit hébergé ailleurs ou stocké localement, le système le localisera à l'aide de la chaîne de nom adressable. Un préfabriqué adressable n'est pas chargé en mémoire tant qu'il n'est pas utilisé et décharge automatiquement les éléments qui lui sont associés lorsqu'il n'est plus utilisé. Cet article de blog sur l'économie de mémoire avec les groupes adressables montre comment vous pouvez organiser vos groupes adressables afin d'être plus efficace en termes de mémoire.
Voir Adressables : Introduction aux concepts pour un aperçu rapide de la façon dont le système d'actifs adressables peut fonctionner dans votre projet.
L'un de nos guides les plus complets rassemble plus de 80 conseils pratiques sur l'optimisation de vos jeux pour PC et consoles. Créés par nos ingénieurs experts Success et Accelerate Solutions, ces conseils détaillés vous aideront à tirer le meilleur parti d'Unity et à améliorer les performances de votre jeu.