0424 soa

soa = structure of arrays

생각만 해봤던 기술인데

이게 실무에 쓰이긴 하나보다.

struct Body {
    Vec3 position;
    Vec3 velocity;
    Vec3 force;
};

vector<Body> bodies;

위처럼 하면 array of structures가 되는데,

bodies[0].position 을 바꾸고 싶다고 할 때

bodies[0] 전체를 캐시에 올리게 됨ㅇㅇ

캐시에 필요한 것만 올리려면

struct Body_SOA {
    vector<Vec3> positions{};
    vector<Vec3> velocity{};
    vector<Vec3> forces{};
};

Body_SOA body_soa{};

이렇게 해서

속성끼리 묶어 뭉탱이를 만들면 됨.

이걸 structure of arrays 라고 한단다.

(별걸 다 줄이는 것 같다)

body_soa.positions[0] 이러면 Vec3 하나만 올라오는거지.

근데 난 안 쓸 것 같음.

가독성이 심각해져서

개발 다 한 후에

리팩토링 할 때나 뭐

그럴 때는 한번 써볼듯.

확실히 재미있는 발상이긴 함.

아니 잠깐만

애초에 아주 옛날 옛적에

"구조체를 지원하지 않는" 언어 인터프리터를 쓸 때,

그때 이렇게 만들었었다.

(프리미티브, 동적배열은 지원함)

// 구조체가 없어서
// 구조체의 각 요소를 다 따로 빼야 함

list[float3] _Positions = {};
list[float3] _Velocities = {};
list[float3] _Forces = {};

float3 get_position(i32 idx) -> _Positions.At(idx);
...

저거 2개의 성능차이도 궁금하긴 하다.

몇백만 개면 체감이 될 듯