Menu
CoddyTech

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.

quiz iconPonte a prueba

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