Conseils d'optimisation pour Unity

Unity est un moteur de jeu populaire non seulement parmi les développeurs indépendants mais également parmi les grandes entreprises.

Il présente une interface conviviale, un pipeline de rendu puissant, un système de composants facile à utiliser et, enfin, il prend en charge une vaste gamme de plates-formes.

Mais avec une interface facile à utiliser, il est encore plus facile de surcompliquer votre jeu (par exemple en plaçant beaucoup d'objets inutiles, etc.), il est donc important d'avoir optimisation à l'esprit tout au long du développement.

Voici des conseils importants pour les 3 grandes catégories (Rendu, Scripting, et Audio) qui vous aideront à améliorer les performances de votre jeu:

Le rendu

Astuce 1: conservez les objets avec le composant de rendu non mis à l'échelle

Les objets non mis à l'échelle sont ceux qui ont une échelle de (1, 1, 1). Dans ce cas, Unity n'a pas besoin d'effectuer de calculs supplémentaires pour redimensionner l'objet dans chaque image.

Exemple: Disons que vous avez un modèle de maison trop grand ou trop petit pour votre niveau. La chose naturelle à faire est de le mettre à l'échelle comme ceci:

Redimensionnement du bâtiment

La plupart du temps, vous pouvez mettre à l'échelle l'objet dans la vue Scène, mais si vous prévoyez d'avoir de nombreuses instances dupliquées de cet objet, il est préférable de modifier l'échelle dans les paramètres d'importation.

La première chose que vous devez faire est de mettre le modèle à l'échelle jusqu'à ce qu'il corresponde à vos besoins (par exemple, le bâtiment ci-dessus a été mis à l'échelle de (1, 1, 1) à (0,49482, 0,49482, 0,49482)), puis de sélectionner le modèle dans le projet. et dans les paramètres d'importation, notez le facteur d'échelle (généralement, il est soit 1, soit 0,1).

Définissez la nouvelle valeur, qui doit être égale au facteur d'échelle par défaut multiplié par la nouvelle échelle (dans mon cas, c'est 1 x 0,49482 = 0,49482), puis appuyez sur Appliquer. Revenez maintenant au modèle dans la vue de la scène et remettez l'échelle sur (1, 1, 1).

Paramètres du facteur d'échelle Unity 3D

L'objet est désormais mis à l'échelle selon vos besoins tout en conservant l'échelle par défaut (1, 1, 1).

Cette astuce est particulièrement importante pour les objets animés qui utilisent SkinnedMeshRenderer car ce composant est plus coûteux à rendre et avoir une échelle de (1, 1, 1) simplifie le processus de rendu.

Astuce 2: utilisez le moins de lumières possible

Il existe 3 types de lumières dans Unity (lumière directionnelle, lumière ponctuelle et projecteur). En termes de performances, la lumière directionnelle est la moins chère pour le rendu, suivie par Point et enfin par Spotlight.

En règle générale, vous ne souhaitez pas avoir plus d'une lumière directionnelle par scène, et pour les spots et les spots, essayez d'en avoir le moins possible (voire aucune).

En termes d'ombres en temps réel, même si cela améliore l'aspect visuel du jeu, il a une surcharge de haute performance donc généralement, il est préférable de les désactiver ou de les intégrer dans lightmaps et light. sondes.

Astuce 3: utilisez les shaders transparents avec prudence

Utilisez uniquement des Shaders transparents ou de particules sur des surfaces qui doivent être transparentes (ex. clôtures, particules de fumée, etc.)

Les objets avec transparence nécessitent une passe de rendu supplémentaire qui pourrait réduire les performances, en particulier sur les plateformes aux ressources limitées, telles que Mobile ou Web.

Script

Astuce 1: Mettez toujours en cache les références aux composants

Vous devez toujours mettre en cache les références des composants si vous prévoyez d'y accéder à chaque mise à jour.

Par exemple, vérifiez le script ci-dessous:

Mauvais

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

Ici, nous avons Script1 qui récupère la variable "someValue2" de Script2 et l'assigne à une variable locale.

Désormais, appeler un seul GetComponent par image n'aura aucun impact sur les performances, cependant, vous devez adopter l'habitude de mettre en cache les composants qui seront fréquemment utilisés.

Il existe deux manières de mettre en cache un composant dans un script: soit créer une variable publique et l'attribuer dans la vue Inspecteur, soit créer une variable privée et l'attribuer depuis Démarrer ou Awake. Vérifiez l'exemple ci-dessous:

Bien

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

Bien mieux, Script2 est désormais accessible à chaque mise à jour sans surcharge de performances.

Faites de même pour les composants intégrés, tels que BoxCollider, Rigidbody, etc. (sauf Transform et GameObject, ceux-ci sont déjà mis en cache par défaut afin que vous puissiez y accéder immédiatement).

Astuce 2: utilisez SendMessage avec prudence

SendMessage vous permet d'appeler une fonction spécifique (si elle existe) sur chaque MonoBehaviour qui est attaché à un objet de jeu.

Par exemple, lorsque vous tirez avec une arme dans le jeu, vous pouvez rapidement infliger des dégâts lorsque la balle touche l'ennemi, sans avoir besoin d'utiliser GetComponent et d'autres éléments supplémentaires.

Cependant, cette méthode ne doit pas être appelée trop fréquemment car elle est assez gourmande en calcul.

Astuce 3: utilisez GameObject.Find et GameObject.FindWithTag avec prudence

GameObject.Find, GameObject.FindWithTag et GameObject.FindGameObjectsWithTag vous permettent de rechercher rapidement les objets dans la scène. Ces méthodes sont beaucoup plus lentes que GetComponent et ne doivent être utilisées que lors de l'initialisation.

Astuce 4: évitez d'utiliser OnGUI

Historiquement, OnGUI était le seul moyen de créer des menus en Unity. Mais depuis, une alternative a été ajoutée appelée UI Canvas qui est bien meilleure en termes de performances et offre beaucoup plus de fonctionnalités.

Néanmoins, OnGUI reste toujours un moyen viable de créer une interface utilisateur en Unity et si vous avez absolument besoin de l'utiliser, gardez à l'esprit qu'OnGUI est appelé au moins deux fois par image (deux fois plus que Update et LateUpdate), alors ne le faites pas. utilisez-le pour tous les calculs autres que l'interface utilisateur.

Une chose que vous pouvez faire est d'avoir un script séparé contenant uniquement OnGUI et de l'activer/désactiver si nécessaire.

Par exemple:

UIScript.cs

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Script1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

UIScript et Script1 sont tous deux attachés au même GameObject. Script1 contrôle quand afficher le menu.

Lorsque le joueur appuie sur Tab, l'UIScript est activé, affichant les boutons. Appuyer à nouveau sur Tab le désactive, masquant les boutons.

Lorsque UIScript est désactivé, la méthode OnGUI n'est pas appelée, ce qui améliore les performances.

Astuce 5: utilisez le profileur

Profiler est l'un des outils les plus importants lorsqu'il s'agit d'identifier les goulots d'étranglement et les baisses de fps, ce qui facilite la recherche de la cause exacte des faibles performances.

l'audio

Les clips audio peuvent être optimisés en s'assurant que leurs paramètres d'importation sont corrects.

Les Paramètres d'importation audio optimaux dépendront de la durée de l'audio, de la fréquence de lecture et de la plate-forme cible.

Articles suggérés
Comment utiliser la mise à jour dans Unity
Le générateur de panneaux d'affichage pour Unity
Paramètres d'importation de clips audio Unity pour les meilleures performances
Unity Optimisez votre jeu à l'aide de Profiler
Améliorer les performances d'un jeu mobile dans Unity
Conseils Twitter pour l'unité
Les concepts fondamentaux de la conception de jeux