introduction to data-oriented design (2014)
TRANSCRIPT
![Page 1: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/1.jpg)
Introduction to Data-Oriented Design
![Page 2: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/2.jpg)
So what is this Data-Oriented Design?
![Page 3: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/3.jpg)
It’s about on shifting focus to how data
is read and written
![Page 4: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/4.jpg)
Why should we care?
![Page 5: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/5.jpg)
Performance
![Page 6: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/6.jpg)
A read from memory takes ~600 cycles at 3.2 GHz
![Page 7: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/7.jpg)
A read from memory takes 40 cycles at 300 MHz
![Page 8: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/8.jpg)
Performance
Disks (Blu-ray/DVD/HDD)
Main Memory
L2 Cache
L1 Cache
CPU / Registers
Latency
:(
600 cycles
40 cycles
1 – 2 cycles
![Page 9: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/9.jpg)
Multithreading
Object
Read? Write?
Object
update()
Object
● Cannot multithread without knowing how data is touched
● Adding locks always protects data not code
Read? Write? Read? Write?
![Page 10: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/10.jpg)
Offloading to co-unit
?
SPU/GPU/APU?
● If data is unknown hard/impossible to run on co-unit
![Page 11: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/11.jpg)
Better design● Data focus can lead to isolated,
self-contained, interchangeable
pieces of data and code
● This can make it easier to test
data and code in isolation
![Page 12: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/12.jpg)
Example - OODclass Bot{
...Vec3 m_position;...float m_mod;...float m_aimDirection;...
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}}
![Page 13: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/13.jpg)
Example - OODclass Bot{
...Vec3 m_position;...float m_mod;...float m_aimDirection;...
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}}
icache-miss
![Page 14: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/14.jpg)
Example - OODclass Bot{
...Vec3 m_position;...float m_mod;...float m_aimDirection;...
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}}
icache-miss
data-miss
![Page 15: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/15.jpg)
Example - OODclass Bot{
...Vec3 m_position;...float m_mod;...float m_aimDirection;...
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}}
icache-miss
data-miss
Unusedcached
data
![Page 16: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/16.jpg)
Example - OODclass Bot{
...Vec3 m_position;...float m_mod;...float m_aimDirection;...
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}}
icache-miss
data-miss
Unusedcached
data
Very hard to optimize!
![Page 17: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/17.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
![Page 18: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/18.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600
![Page 19: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/19.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600
![Page 20: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/20.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600
![Page 21: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/21.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600
~20 cycles
![Page 22: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/22.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
~20 cycles
![Page 23: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/23.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
~20 cycles
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
![Page 24: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/24.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
~20 cycles
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
![Page 25: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/25.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
~20 cycles
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
![Page 26: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/26.jpg)
Example - OOD
void updateAim(Vec3 target){m_aimDirection = dot3(m_position, target) * m_mod;
}
Lets say we call this code 4 times (4 diffrent Bots)
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
~20 cycles
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
iCache – 600 m_position – 600 m_mod - 600 aimDir – 100
7680
![Page 27: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/27.jpg)
Example - DOD
![Page 28: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/28.jpg)
Example - DOD● Design ”back to front” and focus on
the output data
![Page 29: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/29.jpg)
Example - DOD● Design ”back to front” and focus on
the output data
● Then add the minimal amount of data
needed to do the transform to create
the correct output
![Page 30: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/30.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
![Page 31: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/31.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
What has changed?
![Page 32: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/32.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
Only read needed inputs
What has changed?
![Page 33: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/33.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
Only read needed inputs Write to linear array
What has changed?
![Page 34: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/34.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
Only read needed inputs Write to linear array
Loop over all the data
What has changed?
![Page 35: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/35.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
Only read needed inputs Write to linear array
Loop over all the data Actual code unchanged
What has changed?
![Page 36: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/36.jpg)
Example - DODvoid updateAims(float* aimDir,const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i],target) * aim->mod[i];
}}
Only read needed inputs Write to linear array
Loop over all the data Actual code unchanged
What has changed?
Code separated
![Page 37: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/37.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
![Page 38: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/38.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600
![Page 39: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/39.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600
![Page 40: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/40.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600
![Page 41: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/41.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600
~20 cycles
![Page 42: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/42.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600 aimDir – 100
~20 cycles
![Page 43: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/43.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600 aimDir – 100
~20 cycles
![Page 44: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/44.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600 aimDir – 100
~20 cycles
![Page 45: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/45.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600 aimDir – 100
~20 cycles
![Page 46: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/46.jpg)
Example - DODvoid updateAims(float* aimDir, const AimingData* aim,
Vec3 target, uint count){for (uint i = 0; i < count; ++i){aimDir[i] = dot3(aim->positions[i], target) * aim->mod[i];
}}
iCache – 600 positions – 600 mod - 600 aimDir – 100
~20 cycles
1980
![Page 47: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/47.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
![Page 48: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/48.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 49: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/49.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 50: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/50.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 51: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/51.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 52: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/52.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 53: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/53.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 54: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/54.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 55: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/55.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 56: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/56.jpg)
Data layout OOD vs DODpos0
mod0
aimDir0
pos0
Pos1
mod1
aimDir1
pos0 pos0 pos0
pos1 pos1 pos1 pos1
pos2 pos2 pos2 pos2
pos3 pos3 pos3 pos3
mod0 mod1 mod2 mod3
aimDir0 aimDir1 aimDir2 aimDir3
pos0 pos0 pos0
Each color block is one
128 byte cache line
![Page 57: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/57.jpg)
Its all about memory
![Page 58: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/58.jpg)
Its all about memory• Optimize for data first then code
![Page 59: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/59.jpg)
Its all about memory• Optimize for data first then code
• Most code is likely bound by
memory access
![Page 60: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/60.jpg)
Its all about memory• Optimize for data first then code
• Most code is likely bound by
memory access
• Not everything needs to be an
object
![Page 61: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/61.jpg)
Remember
![Page 62: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/62.jpg)
Remember• We are doing games, we know our
data.
![Page 63: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/63.jpg)
Remember• We are doing games, we know our
data.
• Pre-format. Source data and native
data doesn’t need to be the same
![Page 64: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/64.jpg)
Example: Area Triggers
![Page 65: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/65.jpg)
Example: Area Triggers
position position position position
next
position position position position
next
position position position position
next
Source data
(Linked List)
![Page 66: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/66.jpg)
Example: Area Triggers
position position position position
next
position position position position
next
position position position position
next
Source data
(Linked List)
Native Data
(Array)
position position position position
position position
position position
position position position position
position position
count
![Page 67: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/67.jpg)
Example: Culling System
![Page 68: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/68.jpg)
Example: Culling System
Old System
![Page 69: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/69.jpg)
Example: Culling System
Old System New System
(Linear arrays
and brute force)
![Page 70: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/70.jpg)
Example: Culling System
Old System New System
(Linear arrays
and brute force)
3x faster, 1/5 code size, simpler
![Page 71: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/71.jpg)
Data Oriented Design Delivers:
![Page 72: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/72.jpg)
Better Performance
![Page 73: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/73.jpg)
Often simpler code
![Page 74: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/74.jpg)
More parallelizable code
![Page 75: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/75.jpg)
Questions?
![Page 76: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/76.jpg)
Links• Data-Oriented Design (Or Why You Might Be Shooting Yourself in The Foot With OOP)
http://gamesfromwithin.com/data-oriented-design
• Practical Examples in Data Oriented Design
http://bitsquid.blogspot.com/2010/05/practical-examples-in-data-oriented.html
• The Latency Elephant
http://seven-degrees-of-freedom.blogspot.com/2009/10/latency-elephant.html
• Pitfalls of Object Oriented Programming
http://seven-degrees-of-freedom.blogspot.com/2009/12/pitfalls-of-object-oriented-programming.html
• Insomniac R&D
http://www.insomniacgames.com/research_dev
• CellPerformance
![Page 77: Introduction to Data-Oriented Design (2014)](https://reader033.vdocuments.net/reader033/viewer/2022051404/586a3a3e1a28aba3348b7a6f/html5/thumbnails/77.jpg)
Image credits• Cat image: http://icanhascheezburger.com/2007/06/24/uninterested-cat
photo by: Arinn capped and submitted by: Andy
• Playstation 3 and Playstation 2 Copyright to Sony Computer Entertainment
• Xbox 360 Image Copyright to Microsoft
• “WTF” Code quality image: Copyright by Thom Holwerda
http://www.osnews.com/comics