Qué es DOTS#
DOTS (Data-Oriented Technology Stack) es un conjunto de tecnologías de Unity para lograr un rendimiento extremo con muchísimos objetos. Se apoya en tres pilares:
- ECS (Entity Component System): una forma distinta de organizar los datos y la lógica.
- C# Job System: multihilo seguro.
- Burst: compilación ultra rápida.
La idea central es la orientación a datos: colocar los datos en memoria de forma que la CPU los procese a máxima velocidad (aprovechando la caché), en vez de saltar por objetos dispersos.
ECS vs GameObjects#
El Unity clásico que has aprendido usa GameObjects + Componentes (MonoBehaviour). ECS le da la vuelta:
| GameObject + MonoBehaviour | ECS | |
|---|---|---|
| Unidad | GameObject (objeto) | Entity (solo un id) |
| Datos | Campos en componentes | Components (structs puros de datos) |
| Lógica | Métodos en el MonoBehaviour | Systems (procesan todas las entidades de un tipo) |
| En memoria | Objetos dispersos (heap) | Datos empaquetados y contiguos |
| Escala cómoda | Cientos–miles | Decenas de miles–millones |
| Facilidad | Alta | Baja (otra forma de pensar) |
En ECS, una entidad es casi solo un identificador; sus datos son components (structs), y la lógica vive en systems que recorren todas las entidades que tienen ciertos components. Los datos del mismo tipo se guardan juntos y contiguos (por archetypes), lo que la CPU adora.
Por qué es tan rápido#
El cuello de botella moderno no suele ser calcular, sino esperar a que lleguen los datos de la memoria. Los GameObjects están dispersos por el heap: la CPU salta de uno a otro y espera. ECS empaqueta los datos del mismo tipo juntos y contiguos, así la CPU los procesa en ráfaga, sin esperas, y encima en paralelo con Jobs y compilado con Burst. De ahí los saltos de rendimiento con escalas enormes.
Un vistazo al código (para que te suene)#
using Unity.Entities;
using Unity.Mathematics;
// Un component = datos puros (struct)
public struct Velocidad : IComponentData
{
public float3 valor;
}
// Un system procesa TODAS las entidades con esos datos
public partial struct MovimientoSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
float dt = SystemAPI.Time.DeltaTime;
foreach (var (transform, vel) in
SystemAPI.Query<RefRW<LocalTransform>, RefRO<Velocidad>>())
{
transform.ValueRW.Position += vel.ValueRO.valor * dt;
}
}
}No te preocupes si se ve raro: es otra forma de pensar, y esa es exactamente la cuestión.
Cuándo usar DOTS (y cuándo NO)#
Adoptar DOTS tiene un coste alto: curva de aprendizaje empinada, otra mentalidad, menos ejemplos, y mezclarlo con el flujo clásico es incómodo. La mayoría de juegos no lo necesitan. Un plataformas, un shooter normal, un puzzle o un juego móvil típico van perfectos con GameObjects bien optimizados.
- ¿Decenas de miles de unidades a la vez (RTS masivo, simulaciones, bullet-hell extremo)? → DOTS/ECS puede valer la pena
- ¿Rendimiento de CPU al límite y ya exprimiste lo básico y Jobs? → considéralo
- ¿Juego normal (cientos/miles de objetos)? → GameObjects optimizados; DOTS sería sobreingeniería
- ¿Estás aprendiendo Unity? → no empieces por DOTS; domina primero el flujo clásico
Estado y madurez#
DOTS ha ido madurando por paquetes (Entities, Entities Graphics...). En Unity 6 es más usable que hace años, pero sigue siendo terreno avanzado y en evolución. Puedes usar partes (solo Jobs + Burst sobre GameObjects) sin adoptar ECS entero: a menudo es el mejor equilibrio.
Errores frecuentes#
- Adoptar DOTS "porque es más rápido" en un juego que no lo necesita (coste enorme sin beneficio).
- Empezar a aprender Unity por ECS (salta el flujo clásico y te pierdes).
- Esperar mezclar ECS y GameObjects sin fricción.
- Creer que DOTS arregla problemas que en realidad eran basura del GC o draw calls.
Ponte a prueba#
Resumen#
DOTS = orientación a datos con tres pilares: ECS (entidades = id, components = datos, systems = lógica), Jobs y Burst. Empaqueta datos contiguos para exprimir la CPU y escalar a decenas de miles de objetos. Pero es otra mentalidad, avanzada y en evolución: la mayoría de juegos no lo necesitan. Úsalo solo para escala masiva real, y valora usar solo Jobs+Burst sobre GameObjects como término medio.