Entity Component System

유니티의 Entity Component System

기존 방식의 Component System

  • 기존의 Component System은 GameObject와 Component들이 연속적인 메모리 구조로 배치되어 있지 않다
  • 랜덤 메모리에 저장된 Component들은 캐시 미스를 발생시키며, Component에 접근하기 위해 GameObject를 거쳐야만 한다

Entity Component System

  • DOP (Dara-Oriented Programming)으로 설계된 시스템
  • 주요 3요소가 Entity, Component, System이다
    • 기본적인 개념은 다음과 동일하다
  • 엔티티를 정의할 때 필요한 컴포넌트들을 하나의 메모리 청크로서 묶어 저장하는 방식이다

image

  • 위의 예시에서, 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으로 분류한다

image

  • 위의 예시에서, A와 B는 동일한 Archetype이고, C는 별개의 Archetype이다
  • Entity는 런타임에서 Component를 추가하거나 소거할 수 있다

Memory Chunks (Archetype Chunk)

  • Entity의 Archetype에 따라 Entity가 어느 위치에 저장되는지 결정한다
  • Archetype Chunk는 항상 동일한 Archetype 객체 여러 개를 보유하고 있으며, 가용 객체가 부족한 경우에는 새 Page를 추가한다
  • 객체의 Component 구성 요소에 따라(추가 혹은 제거됨에 따라), Entity가 가진 Component는 다른 chunk로 이동한다

image

  • 이는 Archetype과 Memory Chunk의 일대다 관계를 나타낸다
    • 특정 Component를 보유한 Entity들을 탐색하는 데에 있어 툭정 Archetype Pool에서만 실행하면 된다
  • 가용되는 Chunk는 Page(Memory Chunk)에서 그 순설ㄹ 보장하지 않는다
    • 사용 시 Entity는 가장 첫번째 가용할 수 있는 Chunk에 할당된다

출처

Categories: ,

Updated: