En aquest tema, aprendrem sobre la importància de reduir les "draw calls" (crides de dibuix) en Unity per millorar el rendiment del nostre joc. Les draw calls són les instruccions que la CPU envia a la GPU per dibuixar objectes a la pantalla. Un nombre elevat de draw calls pot afectar negativament el rendiment del joc, especialment en dispositius amb recursos limitats com els mòbils.
Conceptes Clau
- Draw Call: Una instrucció enviada per la CPU a la GPU per dibuixar un objecte a la pantalla.
- Batching: La tècnica de combinar múltiples draw calls en una sola per reduir la càrrega de la CPU.
- Static Batching: Agrupació d'objectes estàtics que no es mouen ni canvien durant el joc.
- Dynamic Batching: Agrupació d'objectes dinàmics que poden moure's o canviar durant el joc.
- Instancing: Una tècnica per dibuixar múltiples còpies d'un mateix objecte amb una sola draw call.
Estratègies per Reduir Draw Calls
- Utilitzar Batching Estàtic
El batching estàtic és una tècnica que combina múltiples objectes estàtics en una sola draw call. Això és especialment útil per a escenaris grans amb molts objectes que no es mouen.
Passos per habilitar el batching estàtic:
- Selecciona els objectes que vols agrupar.
- A la finestra de l'Inspector, marca la casella "Static" a la part superior dreta.
- Assegura't que l'opció "Batching Static" estigui activada.
- Utilitzar Batching Dinàmic
El batching dinàmic és una tècnica que combina objectes dinàmics en una sola draw call. Unity ho fa automàticament per a objectes que compleixen certs criteris (com ara tenir menys de 300 vèrtexs).
Consideracions per al batching dinàmic:
- Els objectes han de compartir el mateix material.
- Els objectes han de tenir menys de 300 vèrtexs.
- Utilitzar Instancing
El "instancing" permet dibuixar múltiples còpies d'un mateix objecte amb una sola draw call. Això és útil per a objectes repetitius com arbres, roques, etc.
Passos per habilitar el instancing:
- Crea un material que suporti instancing.
- Marca la casella "Enable GPU Instancing" al material.
// Exemple de codi per habilitar el instancing en un material Material material = new Material(Shader.Find("Standard")); material.enableInstancing = true;
- Optimitzar Materials i Shaders
Utilitzar materials i shaders optimitzats pot reduir el nombre de draw calls. Agrupar objectes que utilitzen el mateix material ajuda a Unity a combinar draw calls.
Consells per optimitzar materials:
- Utilitza materials compartits entre múltiples objectes.
- Redueix el nombre de materials diferents en la teva escena.
- Utilitza shaders simples i optimitzats.
- Utilitzar LOD (Level of Detail)
El LOD és una tècnica que utilitza diferents versions d'un model amb diferents nivells de detall segons la distància a la càmera. Això redueix la càrrega de la GPU i el nombre de draw calls.
Passos per configurar LOD:
- Crea diferents versions del teu model amb diferents nivells de detall.
- Utilitza el component "LOD Group" per assignar els models a diferents nivells de detall.
// Exemple de codi per configurar LOD LODGroup lodGroup = gameObject.AddComponent<LODGroup>(); LOD[] lods = new LOD[2]; lods[0] = new LOD(0.5f, new Renderer[] { highDetailRenderer }); lods[1] = new LOD(0.2f, new Renderer[] { lowDetailRenderer }); lodGroup.SetLODs(lods); lodGroup.RecalculateBounds();
Exercici Pràctic
Objectiu: Reduir el nombre de draw calls en una escena simple.
- Crea una escena amb múltiples objectes estàtics (per exemple, cubs).
- Habilita el batching estàtic per a aquests objectes.
- Crea una sèrie d'objectes dinàmics (per exemple, esferes) i assegura't que compleixin els criteris per al batching dinàmic.
- Crea un material amb instancing habilitat i aplica'l a una sèrie d'objectes repetitius (per exemple, arbres).
- Utilitza el component "LOD Group" per a un model complex.
Solució:
// Exemple de codi per habilitar batching estàtic foreach (GameObject obj in staticObjects) { obj.isStatic = true; } // Exemple de codi per habilitar instancing en un material Material instancedMaterial = new Material(Shader.Find("Standard")); instancedMaterial.enableInstancing = true; foreach (GameObject obj in instancedObjects) { obj.GetComponent<Renderer>().material = instancedMaterial; } // Exemple de codi per configurar LOD LODGroup lodGroup = complexModel.AddComponent<LODGroup>(); LOD[] lods = new LOD[2]; lods[0] = new LOD(0.5f, new Renderer[] { highDetailRenderer }); lods[1] = new LOD(0.2f, new Renderer[] { lowDetailRenderer }); lodGroup.SetLODs(lods); lodGroup.RecalculateBounds();
Errors Comuns i Consells
-
Error: No veure una reducció en les draw calls després d'habilitar el batching.
- Solució: Assegura't que els objectes comparteixin el mateix material i compleixin els criteris per al batching.
-
Error: Utilitzar materials diferents per a objectes que podrien compartir el mateix material.
- Solució: Agrupa objectes que utilitzen el mateix material per reduir draw calls.
-
Consell: Utilitza eines de perfilat de Unity per identificar quins objectes estan generant més draw calls i optimitza en conseqüència.
Conclusió
Reduir el nombre de draw calls és essencial per millorar el rendiment del teu joc, especialment en dispositius amb recursos limitats. Utilitzant tècniques com el batching estàtic i dinàmic, el instancing, i l'optimització de materials i shaders, pots aconseguir una experiència de joc més fluida i eficient. Practica aquestes tècniques en els teus projectes per veure millores significatives en el rendiment.
Curs de Unity
Mòdul 1: Introducció a Unity
- Introducció a Unity i Instal·lació
- Visió General de la Interfície de Unity
- Creant el Teu Primer Projecte
- Objectes de Joc Bàsics i Components
Mòdul 2: Programació Bàsica en Unity
- Introducció a C# per a Unity
- Creant i Adjuntant Scripts
- Entenent MonoBehaviour
- Gestió Bàsica d'Entrades
Mòdul 3: Treballant amb Actius
- Important i Gestionant Actius
- Utilitzant la Botiga d'Actius
- Creant i Utilitzant Prefabs
- Animació Bàsica
Mòdul 4: Física i Col·lisions
- Introducció a la Física de Unity
- Rigidbody i Col·liders
- Detecció Bàsica de Col·lisions
- Utilitzant Materials de Física
Mòdul 5: Interfície d'Usuari (UI)
- Introducció a la UI de Unity
- Creant i Personalitzant Elements de UI
- Gestió d'Esdeveniments de UI
- Creant Menús i HUDs
Mòdul 6: Àudio en Unity
- Introducció a l'Àudio en Unity
- Important i Utilitzant Clips d'Àudio
- Programació Bàsica d'Àudio
- Àudio 3D i So Espacial
Mòdul 7: Programació Avançada
- Conceptes Avançats de C# per a Unity
- Coroutines i Programació Asíncrona
- Objectes Scriptables
- Editors Personalitzats i Gizmos
Mòdul 8: Física Avançada i IA
- Tècniques Avançades de Física
- Pathfinding i Navegació
- Programació Bàsica d'IA
- Màquines d'Estats i Arbres de Comportament
Mòdul 9: Optimització i Rendiment
- Tècniques de Perfilat i Optimització
- Gestió de Memòria
- Reduint Draw Calls
- Optimitzant Física i Col·lisions