En este tema, aprenderemos sobre la reducción de llamadas de dibujo (draw calls) en Unity, un aspecto crucial para optimizar el rendimiento de tu juego. Las llamadas de dibujo son instrucciones enviadas a la GPU para renderizar objetos en la pantalla. Un número elevado de estas llamadas puede afectar negativamente el rendimiento del juego, especialmente en dispositivos con recursos limitados.

Conceptos Clave

  1. Draw Calls: Instrucciones enviadas a la GPU para renderizar un objeto.
  2. Batching: Técnica para agrupar múltiples objetos en una sola llamada de dibujo.
  3. Instancing: Técnica para renderizar múltiples copias de un objeto con una sola llamada de dibujo.
  4. LOD (Level of Detail): Técnica para reducir la complejidad de los modelos a medida que se alejan de la cámara.

Técnicas para Reducir Draw Calls

  1. Batching

Unity ofrece dos tipos de batching: estático y dinámico.

Batching Estático

El batching estático agrupa objetos que no se mueven en una sola llamada de dibujo. Para usarlo:

  1. Selecciona los objetos en la escena.
  2. Marca la casilla "Static" en el Inspector.
// Ejemplo de código para marcar un objeto como estático
gameObject.isStatic = true;

Batching Dinámico

El batching dinámico agrupa objetos que se mueven y comparten el mismo material. Unity lo hace automáticamente si los objetos cumplen ciertos criterios (menos de 300 vértices, mismo material).

  1. Instancing

El instancing permite renderizar múltiples copias de un objeto con una sola llamada de dibujo. Es útil para objetos repetitivos como árboles o rocas.

// Ejemplo de código para usar instancing
Material material = new Material(Shader.Find("Standard"));
material.enableInstancing = true;

  1. Uso de Shaders Eficientes

Los shaders personalizados pueden optimizar el rendimiento. Por ejemplo, los shaders que soportan instancing pueden reducir significativamente las llamadas de dibujo.

// Ejemplo de un shader simple con instancing
Shader "Custom/InstancedShader" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
    }
    SubShader {
        Pass {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_instancing
            #include "UnityCG.cginc"
            struct appdata {
                float4 vertex : POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };
            struct v2f {
                float4 pos : SV_POSITION;
                float4 color : COLOR;
                UNITY_VERTEX_OUTPUT_STEREO
            };
            UNITY_INSTANCING_BUFFER_START(Props)
                UNITY_INSTANCING_BUFFER_END(Props)
            v2f vert (appdata v) {
                v2f o;
                UNITY_SETUP_INSTANCE_ID(v);
                o.pos = UnityObjectToClipPos(v.vertex);
                o.color = v.color;
                return o;
            }
            fixed4 frag (v2f i) : SV_Target {
                return i.color;
            }
            ENDCG
        }
    }
}

  1. Level of Detail (LOD)

El LOD reduce la complejidad de los modelos a medida que se alejan de la cámara. Unity permite configurar LODs para cada modelo.

  1. Selecciona el objeto en la escena.
  2. Añade un componente "LOD Group".
  3. Configura los niveles de detalle.
// Ejemplo de código para configurar LODs
LODGroup lodGroup = gameObject.AddComponent<LODGroup>();
LOD[] lods = new LOD[2];
lods[0] = new LOD(0.5f, new Renderer[] { renderer1 });
lods[1] = new LOD(0.2f, new Renderer[] { renderer2 });
lodGroup.SetLODs(lods);
lodGroup.RecalculateBounds();

Ejercicio Práctico

Ejercicio 1: Implementar Batching Estático

  1. Crea una escena con varios objetos estáticos (por ejemplo, edificios).
  2. Marca todos los objetos como estáticos.
  3. Observa la reducción en las llamadas de dibujo usando el Profiler de Unity.

Ejercicio 2: Usar Instancing

  1. Crea una escena con múltiples copias de un objeto (por ejemplo, árboles).
  2. Aplica un material que soporte instancing.
  3. Observa la reducción en las llamadas de dibujo usando el Profiler de Unity.

Soluciones

Solución Ejercicio 1

  1. Selecciona todos los objetos estáticos en la escena.
  2. Marca la casilla "Static" en el Inspector.
  3. Abre el Profiler (Window > Analysis > Profiler) y observa la reducción en las llamadas de dibujo.

Solución Ejercicio 2

  1. Crea un material que soporte instancing.
  2. Aplica el material a todos los objetos repetitivos.
  3. Abre el Profiler y observa la reducción en las llamadas de dibujo.

Conclusión

Reducir las llamadas de dibujo es esencial para optimizar el rendimiento de tu juego en Unity. Técnicas como el batching, el instancing, el uso de shaders eficientes y el LOD pueden ayudarte a lograr un rendimiento óptimo. Practica estas técnicas en tus proyectos para familiarizarte con ellas y mejorar la eficiencia de tus juegos.

Curso de Unity

Módulo 1: Introducción a Unity

Módulo 2: Programación Básica en Unity

Módulo 3: Trabajando con Activos

Módulo 4: Física y Colisiones

Módulo 5: Interfaz de Usuario (UI)

Módulo 6: Audio en Unity

Módulo 7: Programación Avanzada

Módulo 8: Física Avanzada e IA

Módulo 9: Optimización y Rendimiento

Módulo 10: Publicación y Más Allá

© Copyright 2024. Todos los derechos reservados