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개의 성능차이도 궁금하긴 하다.
몇백만 개면 체감이 될 듯