EveryDay.DevUp

[Unity] DOTS - ECS ( Entity, Component, System ) 본문

Unity

[Unity] DOTS - ECS ( Entity, Component, System )

EveryDay.DevUp 2020. 6. 2. 23:27

ECS를 알아보기 전 DOTS에 대해 궁금한 점이 있다면 하단의 링크를 통해 알아 볼 수 있다.

https://everyday-devup.tistory.com/67

 

[Unity] DOTS ( Data Oriented Technology Stack )

● DOTS란? ▶ Unity를 통해 멀티스레딩과 퍼포먼스 향상이 가능한 차세대 유니티 기반 기술이다. ▶ ECS, Job System, Burst Compiler 의 각 고유한 기능들을 사용하여 DOD ( Data-Oriented Design )을 구현 하..

everyday-devup.tistory.com

● ECS 란?

: ECS는 Entitiy, Component, System의 앞글자를 하나씩 딴 단어로, Unity에서 DOTS를 사용하기 위해 만든 아키텍쳐라고 할 수 있다.

▶ World

: Systems, Entities, Archetypes를 묶은 것으로 Unity에서는 기본적으로 Default World를 제공한다.

: 사용자가 추가로 World를 생성할 수도 있으며, World간에 참조도 가능하지만 World간의 의존성이 발생하기 때문에 권장하지 않는다.

▶ Archetype

: 공통 된 Component를 묶은 데이터, 예를 들어 Position, Rotation, Renderer 데이터를 사용하는 경우 Archetype ( Position, Rotation, Renderer )에서 데이터를 관리하고, Position, Rotation데이터를 사용하는 경우 Archetype ( Position, Rotation )에서 데이터를 관리한다.

: 데이터는 16KB Chunk 단위로 링크드 리스트로 처리된다. 이는 데이터의 삭제와 추가를 빠르게 수행하기 위함인데, 하나의 큰 배열로 처리할 경우 데이터의 삭제와 추가가 발생할 때마다 큰 배열을 정리해야하는 오버헤드가 발생하기 때문이다.

: 링크드 리스트로 관리하면 기존에 사용하던 Chunk가 가득찬 경우 새로운 Chunk를 생성하여 링크로 연결해 주면 되고, 삭제가 필요한 경우 메모리를 해제하고 링크 연결을 끊어 주기만 하면 되기 때문에 속도가 빠르다.

: 공통된 Component 중에서 특정한 Component가 사라지는 경우, 예를 들어 Position, Rotation, Renderer 가 있었는데 이중에 Renderer가 삭제되는 경우  Archetype ( Position, Rotation, Renderer )에서 Archetype ( Position, Rotation ) 으로 변경된 데이터 값이 복사되고 Archetype ( Position, Rotation, Renderer )에서의 변경된 데이터는 삭제 된다. 이 때 오버헤드가 발생하기 때문에 유의해야한다.

[ Entitiy와 Component의 관계 ]

▶ Entity

: Component 데이터 한 묶음을 가리키는 인덱스이다.

▶ Component

: 읽고 쓰기 위한 실제 데이터이다.

[ 새로운 Entitiy가 추가되면 Array에 빈 곳에 해당 데이터를 넣어 줌 ]

 

[ 삭제 시 발행하는 배열의 변화 ]

▶ System

: Entitiy와 Component 조회해서 로직을 수행한다.

참고 자료 : https://www.youtube.com/watch?v=hAp5nx2_Hpg