Optimisez les performances de vos jeux mobiles : Obtenez des conseils d'experts sur les paramètres de physique, d'interface utilisateur et d'audio

Notre équipe de succès intégré soutient les clients de Unity avec leurs problèmes techniques complexes. Nous nous sommes assis avec cette équipe d'ingénieurs logiciels seniors et leur avons demandé de partager une partie de leur expertise sur l'optimisation des jeux mobiles.
Notre équipe Unity Studio Productions connaît le code source sur le bout des doigts et travaille avec une pléthore de clients Unity pour les aider à tirer le meilleur parti du moteur. Dans leur travail, ils plongent profondément dans les projets des créateurs pour aider à identifier les points où la performance pourrait être optimisée pour une plus grande vitesse, stabilité et efficacité.
Alors que nos ingénieurs commençaient à partager leurs idées sur l'optimisation des jeux mobiles, nous avons rapidement réalisé qu'il y avait beaucoup trop d'excellentes informations pour le seul article de blog que nous avions prévu. Au lieu de cela, nous avons décidé de transformer leur montagne de connaissances en un e-book complet (que vous pouvez télécharger ici), ainsi qu'une série d'articles de blog qui mettent en lumière certains de ces 75+ conseils pratiques.
Dans cette deuxième partie de cette série, nous nous concentrons sur la façon d'améliorer les performances avec l'interface utilisateur, la physique et les paramètres audio. Au cas où vous l'auriez manqué, consultez notre article précédent sur le profilage, la mémoire et l'architecture du code – et restez à l'écoute pour notre prochain, dédié aux actifs, à la configuration du projet et aux graphiques.
Vous le voulez tout de suite ? Téléchargez le e-book gratuit.
Entrons directement dans le vif du sujet !
La physique intégrée de Unity (Nvidia PhysX) peut être coûteuse sur mobile, mais les conseils suivants peuvent vous aider à obtenir plus d'images par seconde.
Dans les Paramètres du joueur, vérifiez Pré-cuire les maillages de collision chaque fois que cela est possible.

Assurez-vous de modifier vos paramètres de physique (Paramètres du projet > Physique) et simplifiez votre matrice de collision des couches chaque fois que cela est possible.
Désactivez Synchronisation automatique des transformations et activez Réutiliser les rappels de collision.


Les colliders de maillage peuvent être coûteux. Substituez des colliders de maillage plus complexes par des colliders de maillage primitifs ou simplifiés pour approcher la forme originale.

Utilisez des méthodes de classe comme MovePosition ou AddForce pour déplacer vos objets Rigidbody. Translater directement leurs composants Transform peut entraîner des recalculs du monde physique, ce qui est coûteux dans des scènes complexes. Déplacez les corps physiques dans FixedUpdate plutôt que dans Update.
Le Fixed Timestep par défaut dans les paramètres du projet est de 0,02 (50 Hz). Changez cela pour correspondre à votre fréquence d'images cible (par exemple, 0,03 pour 30 fps).
Cependant, si votre fréquence d'images chute à l'exécution, cela signifie qu'Unity appellerait FixedUpdate plusieurs fois par image et pourrait potentiellement créer un problème de performance CPU avec un contenu lourd en physique.
Le Maximum Allowed Timestep limite le temps que les calculs physiques et les événements FixedUpdate peuvent utiliser en cas de chute de la fréquence d'images. Abaisser cette valeur signifie que pendant un accroc de performance, la physique et l'animation pourraient ralentir, tout en réduisant également leur impact sur la fréquence d'images.

Utilisez la fenêtre de débogage physique (Window > Analysis > Physics Debugger) pour aider à résoudre tout problème de colliders ou de divergences. Cela montre un indicateur codé par couleur des GameObjects qui peuvent entrer en collision les uns avec les autres.

Pour plus d'informations, voir Visualisation de débogage physique dans la documentation Unity.
Unity UI (UGUI) peut souvent être une source de problèmes de performance. Le composant Canvas génère et met à jour des maillages pour les éléments de l'UI et émet des appels de dessin vers le GPU. Son fonctionnement peut être coûteux, alors gardez à l'esprit les facteurs suivants lorsque vous travaillez avec UGUI.
Si vous avez un grand Canvas avec des milliers d'éléments, la mise à jour d'un seul élément de l'UI force la mise à jour de tout le Canvas, ce qui peut potentiellement générer un pic de CPU.
Profitez de la capacité d'UGUI à prendre en charge plusieurs Canvases. Divisez les éléments de l'UI en fonction de la fréquence à laquelle ils doivent être actualisés. Gardez les éléments de l'UI statiques sur un Canvas séparé, et les éléments dynamiques qui se mettent à jour en même temps sur de plus petits sous-canvases.
Assurez-vous que tous les éléments de l'UI dans chaque Canvas ont la même valeur Z, matériaux et textures.
Vous pourriez avoir des éléments de l'UI qui n'apparaissent que sporadiquement dans le jeu (par exemple, une barre de santé qui apparaît lorsqu'un personnage subit des dégâts). Si votre élément de l'UI invisible est actif, il pourrait encore utiliser des appels de dessin. Désactivez explicitement tous les composants de l'UI invisibles et réactivez-les si nécessaire.
Si vous avez seulement besoin de désactiver la visibilité du Canvas, désactivez le composant Canvas plutôt que le GameObject. Cela peut éviter de reconstruire des maillages et des sommets.
Les événements d'entrée comme les touches ou les clics à l'écran nécessitent le composant GraphicRaycaster. Cela parcourt simplement chaque point d'entrée à l'écran et vérifie s'il se trouve dans le RectTransform d'une interface utilisateur.
Supprimez le GraphicRaycaster par défaut du Canvas supérieur dans la hiérarchie. Au lieu de cela, ajoutez le GraphicRaycaster exclusivement aux éléments individuels qui doivent interagir (boutons, scrollrects, etc.).

Désactivez également Raycast Target sur tous les textes et images de l'interface utilisateur qui n'en ont pas besoin. Si l'interface utilisateur est complexe avec de nombreux éléments, tous ces petits changements peuvent réduire les calculs inutiles.

Les groupes de mise en page se mettent à jour de manière inefficace, donc utilisez-les avec parcimonie. Évitez-les complètement si votre contenu n'est pas dynamique, et utilisez des ancres pour des mises en page proportionnelles à la place. Sinon, créez un code personnalisé pour désactiver les composants Layout Group après avoir configuré l'interface utilisateur.
Si vous devez utiliser des groupes de mise en page (Horizontal, Vertical, Grid) pour vos éléments dynamiques, évitez de les imbriquer pour améliorer les performances.

Les grandes vues de liste et de grille sont coûteuses. Si vous devez créer une grande vue de liste ou de grille (par exemple, un écran d'inventaire avec des centaines d'articles), envisagez de réutiliser un petit pool d'éléments d'interface utilisateur plutôt que de créer un élément d'interface utilisateur pour chaque article. Découvrez cet exemple de projet GitHub pour voir cela en action.
Superposer de nombreux éléments d'interface utilisateur (par exemple, des cartes empilées dans un jeu de cartes) crée un surdessin. Personnalisez votre code pour fusionner les éléments superposés à l'exécution en moins d'éléments et de lots.
Avec les appareils mobiles utilisant désormais des résolutions et des tailles d'écran très différentes, créez des versions alternatives de l'UI pour offrir la meilleure expérience sur chaque appareil.
Utilisez le Simulateur de périphérique pour prévisualiser l'UI sur une large gamme de périphériques pris en charge. Vous pouvez également créer des appareils virtuels dans XCode et Android Studio.

Si votre écran de pause ou de démarrage couvre tout le reste de la scène, désactivez la caméra qui rend la scène 3D. De même, désactivez tout élément Canvas d'arrière-plan caché derrière le Canvas supérieur.
Envisagez de réduire le Application.targetFrameRate pendant une interface utilisateur en plein écran, car vous ne devriez pas avoir besoin de mettre à jour à 60 fps.
Laisser le champ Event ou Render Camera vide oblige Unity à remplir Camera.main, ce qui est inutilement coûteux.
Envisagez d'utiliser Screen Space – Overlay pour votre RenderMode Canvas si possible, car cela ne nécessite pas de caméra.

Bien que l'audio ne soit normalement pas un goulot d'étranglement de performance, vous pouvez toujours optimiser pour économiser de la mémoire.

Si vous utilisez un format compressé (comme MP3 ou Vorbis), Unity le décompressera, puis le recomprimera pendant le temps de construction. Cela entraîne deux passes avec perte, dégradant la qualité finale.
Réduisez la taille de vos clips et l'utilisation de la mémoire avec la compression :
- Utilisez Vorbis pour la plupart des sons (ou MP3 pour les sons non destinés à être en boucle).
- Utilisez ADPCM pour les sons courts et fréquemment utilisés (par exemple, les pas, les coups de feu). Cela réduit la taille des fichiers par rapport au PCM non compressé, mais est rapide à décoder pendant la lecture.
Les effets sonores sur les appareils mobiles doivent être au maximum à 22 050 Hz. Utiliser des paramètres plus bas a généralement un impact minimal sur la qualité finale ; utilisez vos propres oreilles pour juger.
Le paramètre varie en fonction de la taille du clip.
- Les petits clips (< 200 ko) doivent se décompresser au chargement. Cela entraîne un coût CPU et mémoire en décompressant un son en données audio PCM brutes 16 bits, donc c'est seulement souhaitable pour les sons courts.
- Les clips moyens (>= 200 ko) doivent rester compressés en mémoire.
- Les gros fichiers (musique de fond) doivent être réglés sur Streaming, sinon l'ensemble de l'actif sera chargé en mémoire d'un coup.
Lors de la mise en œuvre d'un bouton de sourdine, ne vous contentez pas de régler le volume à 0. Vous pouvez Détruire le composant AudioSource pour le décharger de la mémoire, à condition que le joueur n'ait pas besoin de l'activer et de le désactiver très souvent.
Dans le prochain article de blog, nous plongerons directement dans les graphiques et les actifs. Mais si vous souhaitez accéder à la liste complète des conseils et astuces de l'équipe aujourd'hui, notre e-book complet est disponible ici.

Si vous êtes intéressé à en savoir plus sur les services de support intégré et souhaitez donner à votre équipe un accès direct aux ingénieurs, des conseils d'experts et des recommandations de bonnes pratiques pour vos projets, alors consultez les plans de succès de Unity ici.
Nous voulons vous aider à rendre vos applications Unity aussi performantes que possible, donc s'il y a des sujets d'optimisation que vous aimeriez connaître davantage, veuillez nous tenir informés dans les commentaires.
