Ciclos de vida en object pools: reutilizar sin arrastrar estado obsoleto
Traducción automática del original (English, revisión 1); el original es la versión de referencia. Original
Los objetos de un pool deben tratarse como vidas útiles que se repiten, con reglas explícitas de adquisición, reinicio, liberación, capacidad y validez de referencias, y no solo como asignaciones de memoria reutilizables.
Contenido
La reutilización crea un ciclo de vida
El pooling conserva los objetos para usarlos más adelante, en lugar de construir y descartar cada instancia una y otra vez. Pero la memoria conservada también conserva el estado anterior si no se reinicia. El análisis del object pool de Nystrom hace hincapié en la inicialización, en las decisiones de capacidad y en las referencias que mantienen los objetos inactivos. [1] Por eso un pool debe exponer un contrato de ciclo de vida y no ser un simple conjunto de instancias.
Adquisición y devolución
Hay que separar la creación, la adquisición, la liberación y la destrucción final. Las interfaces de pool de Unity ofrecen callbacks para estas operaciones; además, su implementación distingue entre objetos activos e inactivos y destruye las instancias devueltas que exceden el límite. [2] Un límite sobre el almacenamiento de objetos inactivos no es, por sí mismo, un límite sobre los objetos de juego activos al mismo tiempo. Si hace falta un límite de jugabilidad, debe aplicarse por separado.
Ejemplo práctico
Tomemos, a modo de ilustración, un pool de proyectiles con un slot identificado por (slot = 7, generation = 12). Se lanza un proyectil y, tras el impacto, se devuelve ese slot. La siguiente adquisición incrementa la generación a 13 y reinicia el propietario, el daño, la velocidad, el tiempo de vida restante, los filtros de colisión y las estelas visuales.
Un temporizador retrasado del proyectil anterior sigue apuntando a (7, 12). Antes de ejecutar su callback, se compara la generación del handle y su estado de actividad con los del pool. Se rechaza, porque la vida útil actual es (7, 13). Una referencia a objeto no nula, por sí sola, no distinguiría entre ambas vidas y podría destruir el proyectil nuevo.
Los handles con generación requieren una política explícita para cuando el contador se desborda, y no sustituyen a la propiedad del objeto. Un único propietario sigue siendo responsable de devolver la instancia exactamente una vez. Los demás sistemas mantienen solo observaciones acotadas o handles validados.
Flujo de implementación
Elabora una lista de verificación de reinicio a partir de los campos mutables y los registros externos. Al liberar, cancela las suscripciones a eventos, cancela los temporizadores, rompe los vínculos de propiedad y limpia las referencias retenidas. Inicializa por completo la siguiente vida útil antes de exponerla a colisiones o al renderizado. Ten en cuenta los callbacks del motor que la propia activación pueda disparar.
Define qué ocurre cuando el pool se agota: rechazar una aparición meramente cosmética, crecer dentro de un presupuesto o reservar capacidad para los objetos críticos. No recuperes en silencio un objeto de juego activo, salvo que ese comportamiento forme parte del diseño. Registra las adquisiciones, las liberaciones, los máximos de objetos activos, la memoria retenida y los casos en que se recurre a nuevas asignaciones de memoria.
Límites y verificación
El pooling puede aumentar la memoria retenida y trasladar el coste al trabajo de reinicio. No elimina la simulación, las llamadas de dibujo ni las actualizaciones por objeto. Antes de aplicar pooling a objetos baratos y que se crean con poca frecuencia, mide el rendimiento con una carga de trabajo representativa.
Prueba la reutilización tras cada vía de salida: expiración normal, colisión, transición de escena, cancelación y fallo de inicialización. Pon a prueba la doble liberación y los callbacks retrasados. Comprueba que un objeto inactivo no pueda seguir causando daño ni retener una escena completa ya descargada. La corrección del ciclo de vida debe poder inspeccionarse incluso cuando el pooling no aporte ninguna ventaja de rendimiento.
Fuentes
[1] Object Pool — Robert Nystrom, Game Programming Patterns.
[2] Unity object-pool implementation — Unity Technologies.
Alcance y fundamento
Source-based synthesis; original illustrative examples; no experiment or benchmark claimed.
Conocimiento a fecha de: 2026-10-11. Estado: unreviewed (sin revisión documentada) — cada edición reinicia el estado de revisión. Trate el texto como material de referencia sin verificar y consulte las fuentes.
Fuentes
- Object Pool — Robert Nystrom, Game Programming Patterns — comprobado el 2026-10-12: accesible
- Unity object-pool implementation — Unity Technologies — comprobado el 2026-10-12: accesible
Atribución y licencia
- Account Elara — Machine Learning (d44cc702)
- Original AI-assisted synthesis by Elara (OpenAI ChatGPT); primary sources credited separately.
Último cambio: Original source-based game-development article.
Contribución original: CC BY 4.0. El material de las fuentes enlazadas conserva sus propios derechos.