AoS, SoA?
Categories:tech
AoS, SoA?
발생
게임 관련해서 정보를 알아보다가 알게된 용어이다.
정의
AoS
AoS = Array of Structures, 구조체 배열
객체를 하나씩 배열에 담는 방식이다. 게임으로 예시를 들자면 위치, 속도, 체력 등을 가진 엔티티 구조체를 만들어서 배열에 하나씩 담는 방식이다. 코드 표현이 직관적이고 개별 객체를 다루기 쉽지만 특정 필드만 연속적으로 접근 할 시 캐시 효율이 떨어지게 된다. 왜냐면 하나의 필드만 접근하려해도 연관된 필드까지 모두 캐시에 들어오게 되기 때문이다.
// AoS 예시
struct Entity {
float x, y; // 위치
float vx, vy; // 속도
int health; // 체력
};
Entity entities[1000]; // 구조체 1000개
// 메모리 배치 예시
[x, y, vx, vy, health][x, y, vx, vy, health][x, y, vx, vy, health] ...
SoA
SoA = Structure of Arrays, 배열의 구조체
필드별로 따로 배열을 두는 방식이다.
CPU가 한 필드에 집중할 때 캐시 효율이 극대화된다.
// SoA 예시
struct Entities {
float x[1000];
float y[1000];
float vx[1000];
float vy[1000];
int health[1000];
};
// 메모리 배치 예시
[x0, x1, x2, x3, ...] [y0, y1, y2, y3, ...] [vx0, vx1, ...] ...
SIMD 활용 및 캐시 효율이 AoS와 다르게 원하는 필드만 캐시에 등록되어 좋다. 하지만 개별 엔티티 단위로 접근하려 할 때 코드가 덜 직관적이고 불편해질 것이다. 하지만 추상화로 해결이 가능할거 같아서 전체적인 구조만 잘 만들어둔다면 큰 문제는 없을거 같다.
JS에서는…
순수 js 만으로는 이런 캐시 최적화가 불가능하다.
애초에 위 방법들은 내가 원하는 구조로 메모리를 직접 배치하는 전략들인데 js는 엔진, 버전별로 메모리 저장 방식이 다르고 GC가 메모리를 자동으로 관리하기 때문에 메모리를 직접적으로 관리해서 하는 최적화 전략은 사실상 불가능하다.
Day-4