Ce este DOD?
Data-Oriented Design e un paradigma de programare popularizat de Mike Acton (Insomniac Games) care spune:
If you don't understand the data, you don't understand the problem.
In loc sa organizezi codul in jurul obiectelor (ca in OOP), organizezi datele in jurul modului in care sunt accesate.
Principiile DOD
- Structurile de date determina algoritmii — nu invers
- Organizezi datele dupa acces, nu dupa logica — datele folosite impreuna stau impreuna
- Minimizezi cache miss-urile — Memory Wall e inamicul numarul 1
- Separi datele de comportament — spre deosebire de OOP
Exemplu: Sistem de particule
Abordarea OOP:
class Particle {
float x, y, vx, vy, life;
};
vector<Particle> particles;
// Iterezi: sari printre campuri, uzura cache
Abordarea DOD:
struct Particles {
vector<float> x, y; // pozitiile impreuna
vector<float> vx, vy; // vitezele impreuna
vector<float> life; // viata separat
};
// Cand actualizezi doar pozitia, accesezi doar x si y
// Totul e secvential in memorie → cache friendly
AOS vs SOA
Aceasta diferenta e cunoscuta si ca:
- AOS (Array of Structures) — stil OOP: un array de obiecte
- SOA (Structure of Arrays) — stil DOD: un struct cu array-uri pentru fiecare camp
// AOS — Stil clasic OOP
struct Particle { float x, y, vx, vy, life; };
Particle particles[1000];
// Acces: particles[i].x, particles[i].y — sarituri in memorie
// SOA — Stil DOD
struct Particles {
float x[1000], y[1000], vx[1000], vy[1000], life[1000];
};
// Acces: x[i], y[i] — secvential, cache-friendly
Cand folosesti DOD?
| Potrivit pentru | Mai putin potrivit | |---|---| | Sisteme performanta-critice (jocuri, simulari) | Aplicatii CRUD simple | | Procesare in timp real | Prototipuri rapide | | Procesare pe batch-uri mari | Cod cu logica de business complexa | | Embedded / console | Aplicatii unde mentenanta e mai importanta |