본문 바로가기
개발/Unity

[Unity][DOTS] ECS의 핵심, Archetype과 Chunk

by 가리봉맨 2019. 3. 26.
반응형

유니티에서 밀고 있는 개발 패러다임인 DOTS는 Data-Oriented Tech Stack의 약자다. DOTS는 C# Job System, Entity Component System(ECS), Burst Compiler로 이뤄져 있다. ECS는 이름 그대로 Entity, Component, System을 모아 놓은 것이다. DOTS의 핵심은 데이터인데 ECS의 세 요소 중 Component가 바로 데이터다. 나머지 두 요소도 간단히 살펴보겠다. Entity는 여러 종류의 Component 묶음을 가리키고 있을 뿐이다. System은 Component의 값을 바꾸거나 Component를 이용해서 프로그램의 로직을 수행하는 일을 한다.

Archetype과 Chunk는 ECS가 Component를 저장하고 관리하는 구조의 핵심 요소다. ECS, 나아가 DOTS가 추구하는 목표와 방향은 단순하다. 하드웨어의 특성에 따른 설계를 통해 최고의 성능을 얻는 것이다.


<출처: https://youtu.be/fp1D45hhVEM>

CPU(Processor)는 메모리(RAM)보다 처리 속도가 훨씬 빠르다. 시간이 지날수록 그 차이는 점점 벌어지고 있다. 결국 메모리에 접근하는 시간을 줄이는 것이 성능 향상의 핵심이다. 자주 쓰는 데이터를 메모리를 통하지 않고 가져올 수 있도록 해주는 하드웨어가 캐쉬(Cache)다.


<출처: https://youtu.be/fp1D45hhVEM>

그런데 캐쉬는 아주 작기 때문에 메모리에 데이터를 저장할 때 전략적으로 해야한다. 다음 그림처럼 데이터가 메모리 여기저기에 흩어져 있으면 캐쉬를 제대로 활용할 수 없다.


<출처: https://youtu.be/fp1D45hhVEM>

메모리 사이에 빈 공간이 없도록 데이터를 촘촘하게 저장해야 한다. Archetype과 Chunk는 이런 원리에 따라 만들어졌다. Archetype은 배열(array)의 묶음이다. 데이터 구조 중 하나인 그 배열이 맞다. 각각의 배열에는 한 가지 타입의 Component가 저장된다. 이 배열들을 묶어 놓은 것이 Archetype이다. 아래 그림에서 오렌지색 Position과 초록색 Position을 가로 방향으로 합친 것이 배열 하나다. 당연히 Entity 갯수가 늘어나면 다른 색깔의 Position이 붙고 배열의 크기도 커진다. 그리고 세로 방향으로 같은 타입의 컴포넌트들을 묶은 것이 Entity다.

  
<출처: https://goo.gl/DTpqsE>

Archetype은 Chunk들의 묶음으로 이뤄져있다. Chunk는 크기가 정해져 있기 때문에(16kb) 해당 Entity의 갯수가 늘어나면 Archetype을 구성하는 Chunk의 갯수도 늘어나게 된다. 즉, 경우에 따라 Archetype을 구성하는 Chunk가 하나일 수도 있다.


<출처: https://goo.gl/DTpqsE>

예를 들어 Entity가 10개의 Component로 이뤄져 있다면 해당 Archetype의 각 Chunk는 10개의 배열을 갖는다. 다음 그림과 같이 Chunk의 세로 방향 묶음 하나가 Entity 한 개다.


<출처: https://youtu.be/fp1D45hhVEM>

Chunk 하나의 데이터는 메모리상에 촘촘히 저장된다. 따라서 캐쉬에 의한 성능 향상 효과를 크게 얻을 수 있다. Entity 하나에 포함된 구성 요소, 즉 Component 타입이 늘어날수록 Chunk 하나에 저장할 수 있는 Entity 개수가 적어진다. Chunk 하나의 크기는 16kb로 정해져 있기 때문에 세로가 늘어나면 가로가 줄어드는 것이다. 저장해야 하는 Entity 개수는 그대로이기 때문에 Archetype을 구성하는 Chunk의 개수도 늘어난다. 따라서 Entity 설계 시 필요 없는 Component가 들어가지 않도록 신경 써야 한다.

Archetype은 단순히 ECS의 데이터 저장 방식에 대한 개념에 그치지 않는다. ECS의 System은 Archetype을 기준으로 Componet를 다룬다. 따라서 ECS 프로그래밍을 하면 API를 통해 Archetype과 Chunk를 직접 사용하게 된다. 이 부분은 다음 포스트에서 설명하겠다.

[참고 자료]

 

반응형

댓글