유니티의 Entity Component System
기존 방식의 Component System
- 기존의 Component System은 GameObject와 Component들이 연속적인 메모리 구조로 배치되어 있지 않다
- 랜덤 메모리에 저장된 Component들은 캐시 미스를 발생시키며, Component에 접근하기 위해 GameObject를 거쳐야만 한다
Entity Component System
- 위의 예시에서, Systme은 Component인 Translation과 Rotation을 읽어 연산한 값을 LocalToWorld로 업데이트한다
- Entity A, B는 Renderer Component를 가지고 있지만, C는 없다
- 예시의 System은 Renderer Component의 유무와는 상관없이 연산을 수행할 수 있다
- System은 세팅에 따라 Renderer Component를 필수로 하여 C를 연산에서 제외할 수 있다
- 혹은 Renderer Component를 반드시 제외하도록 하여 A, B를 연산에서 제외할 수도 있다
Archetype
- 하나의 유니크한 Component의 집합(을 가진 Entity)을 Archetype이라 한다
- 이를테면 게임에서 동일한 종류의 여러 몬스터들은 서로 다른 객체이지만, 동일한 Component 구조를 공유하므로 같은 Archetype으로 분류한다
- 위의 예시에서, A와 B는 동일한 Archetype이고, C는 별개의 Archetype이다
- Entity는 런타임에서 Component를 추가하거나 소거할 수 있다
Memory Chunks (Archetype Chunk)
- Entity의 Archetype에 따라 Entity가 어느 위치에 저장되는지 결정한다
- Archetype Chunk는 항상 동일한 Archetype 객체 여러 개를 보유하고 있으며, 가용 객체가 부족한 경우에는 새 Page를 추가한다
- 객체의 Component 구성 요소에 따라(추가 혹은 제거됨에 따라), Entity가 가진 Component는 다른 chunk로 이동한다
- 이는 Archetype과 Memory Chunk의 일대다 관계를 나타낸다
- 특정 Component를 보유한 Entity들을 탐색하는 데에 있어 툭정 Archetype Pool에서만 실행하면 된다
- 가용되는 Chunk는 Page(Memory Chunk)에서 그 순설ㄹ 보장하지 않는다
- 사용 시 Entity는 가장 첫번째 가용할 수 있는 Chunk에 할당된다
출처