Por qué usar un pool de objetos
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 37 de 50.
Un arma que dispara 10 balas por segundo durante un minuto llama a Instantiate 600 veces y a Destroy 600 veces. Cada Instantiate copia el prefab con todos sus componentes y ejecuta sus métodos Awake, OnEnable y Start. Cada Destroy ejecuta OnDisable y OnDestroy, y deja la memoria del objeto como basura. El recolector de basura de C# libera esa memoria más tarde, y su trabajo recae en algunos fotogramas y no en otros, lo que se nota como tirones, sobre todo en teléfonos más lentos.
Un pool conserva los objetos en lugar de destruirlos. Una bala disparada se desactiva con SetActive(false) y vuelve al pool; el siguiente disparo saca una y la activa, e Instantiate solo se ejecuta cuando el pool está vacío. Tras los primeros segundos de disparos, ya no se crea nada nuevo al disparar y no se genera basura. Al reutilizar un objeto, Awake y Start no se ejecutan de nuevo: se ejecutaron una vez, cuando se creó el objeto. Todo lo que deba reiniciarse en cada uso, como un temporizador, la salud o la velocidad, se restablece en OnEnable o mediante el código que saca el objeto.
El pooling resulta útil para los objetos que se crean y descartan a menudo: balas, chispas, números de daño y enemigos de un juego de oleadas. No resulta útil para un jefe que aparece una sola vez ni para un menú que se abre de vez en cuando. Un pool mantiene ocupada en todo momento la memoria de sus objetos inactivos, así que conserva una cantidad razonable y libera los que sobran.
Pruébalo tú mismo
Esta lección no incluye un desafío de código.
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos de UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logro6Guardar con JSON
JsonUtilityGuardar la partidaCargar y valores predeterminadosRepaso: ranuras de guardado9Pool de objetos
Por qué usar un pool de objetosUn pool con una colaObjectPool de UnityResumen: pool de balas