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

@@ -300,6 +300,10 @@ constexpr float BOID_MAX_SPEED = 2.5f; // Velocidad máxima (píxe
constexpr float BOID_MAX_FORCE = 0.05f; // Fuerza máxima de steering (REDUCIDA para evitar aceleración excesiva)
constexpr float BOID_MIN_SPEED = 0.3f; // Velocidad mínima (evita boids estáticos)
// FASE 2: Spatial Hash Grid para optimización O(n²) → O(n)
constexpr float BOID_GRID_CELL_SIZE = 100.0f; // Tamaño de celda del grid (píxeles)
// Debe ser ≥ BOID_COHESION_RADIUS para funcionar correctamente
constexpr float PI = 3.14159265358979323846f; // Constante PI
// Función auxiliar para obtener la ruta del directorio del ejecutable