学习随笔⼀SOAAOS⾯向对象与⾯向数据
SOA 数组的结构与AOS结构的数组,是⾯向数据和⾯向对象设计的区别之⼀。
在需要⾼频率(如渲染循环中)访问数据的时候,⼀般情况下SOA的效率⾼于AOS,因为将需要频繁访问的数据连续存放会⼤⼤提⾼访问速度。虽然AOS的结构可能更适合⾯向对象设计,但是在⾼度依赖效率的地⽅应该使⽤SOA。
引⽤⼤家都在说的⼀句话:⼀开始写程序⽤struct (c⽅式的编程,⾯向数据的编程) 后⾯开始⽤class (为了改善程序结构,OO⽅式的编程)最后⼜开始⽤struct(为了性能!)
引⽤⼀篇⽂章来说明SOA 与 AOS(⾯向数据设计与⾯向对象设计) 两种⽅式的区别
My understanding of Data Oriented Design is that it is about organizing your data for efficient processing. Especially with respect to cache misses etc. Data Driven Design on the other hand is about letting data control a lot of your programs behavior
Say you have ball objects in your application with properties such as color, radius, bounciness, position etc. In OOP you would describe you balls like this:
class Ball {
Point  pos;
Color  color;
double radius;
void draw();
};
And then you would create a collection of balls like this:
vector<Ball> balls;
In Data Oriented Design however you are more likely to write the code like this:
class Balls {
vector<Point>  pos;
vector<Color>  color;
vector<double> radius;soa
void draw();
};
As you can see there is no single unit representing one Ball anymore. Ball objects only exist implicitly. I don't want to rewrite the article so I am not going to go into detail why one does it like this, but it can have many advantages performance wise. Usually we want to do operations on many balls at the same time. Hardware usually want large continuous chunks of memory to operate efficiently. Secondly you might do operations that affects only part of a balls properties. E.g. if you combine the colors of all the balls in various ways, then you want your cache to only contain color information. However when all ball properties are stored in one unit you will pull in all the other properties of a ball as well. Even though you don't need them.
Say a ball each ball takes up 64 bytes and a Point takes 4 bytes. A cache slot takes say 64 bytes as well. If I want to update the position of 10 balls I have to pull in 10*64 = 640 bytes of memory into cache and get 10 cache misses. If however I can work the positions of the balls as separate units, that will only take 4*10 = 40 bytes. That fits in one cache fetch. Thus we only get 1 cache miss to upd
ate all the 10 balls. These numbers are arbitrary I assume a cache block is bigger.
But it illustrates how memory layout can have severe effect cache hits and thus performance. This will only increase in importance as the difference between CPU and RAM speed widens.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。