ecs Survivors: siete meses de mejoras y refactorización

Fuentes: ECS Survivors Parts VII - X

Este artículo del blog de Laurent Voisard detalla el desarrollo de un juego llamado ECS Survivors, centrándose en las mejoras y refactorizaciones realizadas durante un período de siete meses. El proyecto utiliza el paradigma de Sistemas de Componentes y Entidades (ECS), un enfoque de diseño de juegos que promueve la modularidad y la flexibilidad.

Tilemaps y Optimización de Renderizado: Inicialmente, el juego tenía un fondo simple. Se implementaron tilemaps (mapas de baldosas) utilizando la herramienta Tiled para crear niveles complejos. La primera implementación dibujaba cada tile individualmente, lo que generaba una gran cantidad de llamadas de dibujo (draw calls) y afectaba el rendimiento. Para solucionar esto, se implementó una técnica de “captura de pantalla” (render texture) donde el tilemap se renderiza una sola vez y luego se dibuja la imagen resultante, reduciendo drásticamente las llamadas de dibujo. Además, se abordó el problema de los colliders (detectores de colisión) asociados a cada tile, implementando un algoritmo de “meshing greedy” para combinar colliders adyacentes y reducir su número.

Detección de Colisiones Acelerada: A medida que el juego se hacía más complejo y se introducían más enemigos, la detección de colisiones basada en comparación cuadrática se volvió ineficiente. Se implementó una rejilla de hash espacial (spatial hashing grid) para acelerar la búsqueda de colisiones. Esta técnica divide el espacio de juego en celdas, permitiendo que solo se comprueben las colisiones con entidades dentro de las celdas vecinas, lo que resulta en una mejora significativa del rendimiento (más de 10 veces).

Progresión del Jugador: Se añadió un sistema de progresión del jugador, donde los enemigos derrotados otorgan experiencia y, al subir de nivel, el jugador elige entre tres mejoras aleatorias. Esto se integra con un framework de interfaz de usuario (GUI) previamente construido.

Refactorización Arquitectónica: La parte más extensa del desarrollo fue una refactorización completa del código. Se reorganizó la jerarquía de archivos y se configuró CMake para crear módulos separados, mejorando la modularidad y la capacidad de reutilización del código. Se crearon clases base para aplicaciones gráficas y no gráficas, permitiendo la creación de diferentes aplicaciones basadas en el mismo código base, como un editor y una aplicación de prueba sin interfaz gráfica. Finalmente, se implementó un sistema de registro (logging) simple para facilitar la depuración y el desarrollo.

En resumen, el artículo describe un proceso de desarrollo iterativo que involucra optimización de rendimiento, implementación de características de juego y refactorización de código para mejorar la arquitectura y la modularidad del proyecto ECS Survivors.