Consejos de optimización para Unity

Unity es un motor de juego que es popular no sólo entre los desarrolladores independientes sino también entre las grandes empresas.

Cuenta con una interfaz fácil de usar, un potente canal de renderizado, un sistema de componentes fácil de usar y, por último, admite una amplia gama de plataformas.

Pero con una interfaz fácil de usar, es aún más fácil complicar demasiado tu juego (por ejemplo, colocando muchos objetos innecesarios, etc.), por lo que es importante tener optimización en mente durante todo el curso del desarrollo.

Aquí encontrarás consejos importantes para las 3 categorías principales (Renderizado, Scripting, y Audio) que te ayudarán a mejorar el rendimiento de tu juego:

Representación

Consejo 1: Mantenga los objetos con el componente Renderizador sin escalar

Los objetos sin escala son aquellos que tienen una escala de (1, 1, 1). En ese caso, Unity no tiene que hacer cálculos adicionales para cambiar la escala del objeto en cada cuadro.

Ejemplo: Digamos que tienes un modelo de casa que es demasiado grande o demasiado pequeña para tu nivel. Lo natural es escalarlo así:

Cambiar el tamaño del edificio

La mayoría de las veces está bien escalar el objeto en la vista de escena, pero si planea tener muchas instancias duplicadas de ese objeto, es preferible cambiar la escala en la Configuración de importación.

Lo primero que debe hacer es escalar el modelo hasta que se ajuste a sus necesidades (por ejemplo, el edificio de arriba se escaló de (1, 1, 1) a (0,49482, 0,49482, 0,49482)), luego seleccione el modelo en el Proyecto. vista y en la Configuración de importación anote el Factor de escala (normalmente es 1 o 0,1).

Establezca el nuevo valor, que debería ser igual al factor de escala predeterminado multiplicado por la nueva escala (en mi caso es 1 x 0,49482 = 0,49482), luego presione Aplicar. Ahora regrese al modelo en la vista de escena y establezca la escala nuevamente en (1, 1, 1).

Configuración del factor de escala de Unity 3D

El objeto ahora tiene la escala que necesita conservando la escala predeterminada (1, 1, 1).

Este consejo es especialmente importante para objetos animados que usan SkinnedMeshRenderer, ya que este componente es más costoso de renderizar y tener una escala de (1, 1, 1) simplifica el proceso de renderizado.

Consejo 2: utilice la menor cantidad de luces posible

Hay 3 tipos de luces en Unity (luz direccional, luz puntual y foco). En términos de rendimiento, la luz direccional es la más barata para renderizar, luego la puntual y, por último, el foco.

Generalmente, no querrás tener más de una luz direccional por escena, y para las luces puntuales y puntuales intenta tener la menor cantidad posible (o ninguna).

En términos de sombras en tiempo real, si bien mejora el aspecto visual del juego, tiene una sobrecarga de alto rendimiento, por lo que, en general, es mejor desactivarlas o incorporarlas en lightmaps y light. sondas.

Consejo 3: utilice sombreadores transparentes con precaución

Utilice únicamente sombreadores transparentes o de partículas en superficies que deban ser transparentes (por ejemplo, vallas, partículas de humo, etc.)

Los objetos con transparencia requieren un paso de renderizado adicional que podría reducir el rendimiento, especialmente en plataformas con recursos limitados, como Mobile o Web.

secuencias de comandos

Consejo 1: almacenar siempre en caché las referencias de los componentes

Siempre debe almacenar en caché las referencias de los componentes si planea acceder a ellos en cada actualización.

Por ejemplo, consulte el siguiente script:

Malo

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

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

Aquí tenemos Script1 que obtiene la variable "someValue2" de Script2 y la asigna a una variable local.

Ahora, llamar solo a un GetComponent en cada cuadro no tendrá ningún impacto en el rendimiento; sin embargo, debe adoptar el hábito de almacenar en caché los componentes que se utilizarán con frecuencia.

Hay dos formas de almacenar en caché un componente en un script: crear una variable pública y asignarla en la vista Inspector, o crear una variable privada y asignarla desde Inicio o Activación. Consulte el siguiente ejemplo:

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;
    }
}

Mucho mejor, ahora se puede acceder a Script2 en cada actualización sin sobrecarga de rendimiento.

Haga lo mismo con los componentes integrados, como BoxCollider, Rigidbody, etc. (excepto Transform y GameObject, estos ya están almacenados en caché de forma predeterminada para que pueda acceder a ellos de inmediato).

Consejo 2: utilice SendMessage con precaución

SendMessage te permite llamar a una función específica (si existe) en cada MonoBehaviour que esté adjunto a un objeto del juego.

Por ejemplo, cuando disparas un arma en el juego, puedes infligir daño rápidamente cuando la bala alcanza al enemigo, sin la necesidad de usar GetComponent y otras cosas adicionales.

Sin embargo, este método no debe llamarse con demasiada frecuencia ya que requiere bastante procesamiento.

Consejo 3: utilice GameObject.Find y GameObject.FindWithTag con precaución

GameObject.Find, GameObject.FindWithTag y GameObject.FindGameObjectsWithTag te permiten buscar rápidamente los objetos en la escena. Estos métodos son mucho más lentos que GetComponent y sólo deben usarse durante la inicialización.

Consejo 4: evite el uso de OnGUI

Históricamente, OnGUI era la única forma de crear menús en Unity. Pero desde entonces, se agregó una alternativa llamada UI Canvas que es mucho mejor en términos de rendimiento y ofrece mucha más funcionalidad.

Sin embargo, OnGUI sigue siendo una forma viable de crear UI en Unity y si es absolutamente necesario usarlo, tenga en cuenta que OnGUI se llama al menos dos veces por cuadro (el doble que Update y LateUpdate), así que no lo haga. Úselo para cualquier cálculo además de la interfaz de usuario.

Una cosa que puede hacer es tener un script separado que solo contenga OnGUI y habilitarlo/deshabilitarlo cuando sea necesario.

Por ejemplo:

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;
        }
    }
}

Tanto UIScript como Script1 están adjuntos al mismo GameObject. Script1 controla cuándo mostrar el menú.

Cuando el jugador presiona Tab, se habilita UIScript y muestra los botones. Al presionar Tab nuevamente se desactiva, ocultando los botones.

Mientras UIScript está desactivado, no se llama al método OnGUI, lo que a su vez mejora el rendimiento.

Consejo 5: utilice el generador de perfiles

Profiler es una de las herramientas más importantes cuando se trata de identificar cuellos de botella y caídas de fps, lo que facilita encontrar la causa exacta del bajo rendimiento.

Audio

Los clips de audio se pueden optimizar asegurándose de que sus configuraciones de importación sean correctas.

La configuración de importación de audio óptima dependerá de la duración del audio, la frecuencia de reproducción y la plataforma de destino.

Artículos sugeridos
El generador de vallas publicitarias para la unidad
Cómo utilizar Update en Unity
Configuración de importación de clips de audio de Unity para obtener el mejor rendimiento
Unity optimiza tu juego con Profiler
Mejorar el rendimiento de un juego móvil en Unity
Consejos de Twitter para la unidad
Cómo convertirse en un mejor programador en Unity