FASE 2: Spatial Hash Grid - Optimización O(n²) → O(n) para boids

Implementado sistema genérico de particionamiento espacial reutilizable
que reduce drásticamente la complejidad del algoritmo de boids.

**MEJORA DE RENDIMIENTO ESPERADA:**
- Sin grid: 1000 boids = 1M comparaciones (1000²)
- Con grid: 1000 boids ≈ 9K comparaciones (~9 vecinos/celda)
- **Speedup teórico: ~100x en casos típicos**

**COMPONENTES IMPLEMENTADOS:**

1. **SpatialGrid genérico (spatial_grid.h/.cpp):**
   - Divide espacio 2D en celdas de 100x100px
   - Hash map para O(1) lookup de celdas
   - queryRadius(): Busca solo en celdas adyacentes (máx 9 celdas)
   - Reutilizable para colisiones ball-to-ball en física (futuro)

2. **Integración en BoidManager:**
   - Grid poblado al inicio de cada frame (O(n))
   - 3 reglas de Reynolds ahora usan queryRadius() en lugar de iterar TODOS
   - Separación/Alineación/Cohesión: O(n) total en lugar de O(n²)

3. **Configuración (defines.h):**
   - BOID_GRID_CELL_SIZE = 100.0f (≥ BOID_COHESION_RADIUS)

**CAMBIOS TÉCNICOS:**
- boid_manager.h: Añadido miembro spatial_grid_
- boid_manager.cpp: update() poblа grid, 3 reglas usan queryRadius()
- spatial_grid.cpp: 89 líneas de implementación genérica
- spatial_grid.h: 74 líneas con documentación exhaustiva

**PRÓXIMOS PASOS:**
- Medir rendimiento real con 1K, 5K, 10K boids
- Comparar FPS antes/después
- Validar que comportamiento es idéntico

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-12 05:46:34 +02:00
parent 6aacb86d6a
commit abbda0f30b
5 changed files with 206 additions and 11 deletions

View File

@@ -2,7 +2,8 @@
#include <cstddef> // for size_t
#include "../defines.h" // for SimulationMode, AppMode
#include "../defines.h" // for SimulationMode, AppMode
#include "../spatial_grid.h" // for SpatialGrid
// Forward declarations
class Engine;
@@ -98,6 +99,10 @@ class BoidManager {
// Estado del modo boids
bool boids_active_;
// Spatial Hash Grid para optimización O(n²) → O(n)
// FASE 2: Grid reutilizable para búsquedas de vecinos
SpatialGrid spatial_grid_;
// Métodos privados para las reglas de Reynolds
void applySeparation(Ball* boid, float delta_time);
void applyAlignment(Ball* boid, float delta_time);