ECS는 기본적으로 


MVC와 같이 소프트 웨어 아키텍쳐 패턴이다. 


ECS는 게임 오버워치에서 처음 언급됐는데(GDC 2017 게임 플레이 아키텍쳐)


구체적으로 말하자면 ECS는 엔터티-컴포넌트 시스템을 말한다.


엔터티-객체를 식별하는데 사용되는 고유 식별자, 자체에 데이터를 포함하지 않고, ID로써 개체를 식별하는 기능을 가짐


컴포넌트-컴포넌트는 객체의 속성을 설명하는 일부 데이터를 포함하는 데이터 구조. 컴포넌트에는 비헤이비어가 없다.


시스템- 주로 사용자 로직 처리 및 상태 마이그레이션이며, 어떠한 데이터도 시스템에 저장 되지 않는다.


22aec568f5dc3f8650bbd58b3680756f382b47

World는시스템과 엔터티의 조합이다.


ECS 프레임워크의 특징은 객체의 데이터와 비헤이비어가 제거되고, 업데이트 기능에서 관련된 작업을 처리하는 대신 특정 시스템이 특정 동작을 처리한다.


유니티 ECS의 기본 개념은


핵심은 라이프 사이클 관리다. 포인터 대신 32비트 ID로 표현되며, 렌더링에 사용되는 리소스 ID도 첨부된다. 

라이프 사이클 만 담당하고, 메서드를 호출하지 않도록 설계되었기때문에 int ID를 사용하는 것이 강력하다. 


엔터티는 ECS의 기본이자, 인덱스, 버전으로 구성되어있다. 버전은 엔테티가 재활용된 후 1씩 증가하는데, 


이 구성요소는 ECS만의 데이터 유형인 '청크(chunk)에 저장된다. 컴포넌트 데이터를 조작할때, 해당 Index에 따라 엔터티 데이터 매니저에 위치한 청크와 청크 인덱스를 찾아 해당하는 컴포넌트 데이터를 얻은 후 작업한다.


컴포넌트


-컴포넌트는 엔터티의 속성이며, 일반적으로 IComponent, 또는 IsharedComponenetData 인터페이스 구조로 기록됨


엔터티는 여러 컴포넌트를 포괄할 수 있다. IShaderedComponentData로 기록된 데이터는 동시에 여러 엔터티 간에 공유되고, 게임 오브젝트 또는 렌더 메쉬같은 렌더링 관련해서 저장하는데 사용된다.


엔터티의 구성요소는 CreatEntity시 지정되거나, ArchType를 사용하여 기존 엔터티에 복사되고, AddComponent 및 RemovemComponent 구성요소를 동적 추가삭제 가능하다. 하지만 효율성 문제로 ㅜ건장하지 않는다.



viewimage.php?id=3dafdf21f7d335ab67b1d1&no=24b0d769e1d32ca73de98efa11d02831add4b458ef65c5a3ba55a68bb9d3d4e9b1670255ccf8f75734b37d2ea36fdfecbb9f04b7a4a97d9d41657336544986abcd77912ea5b761

(컴포넌트 조합이 같은 것끼리 묶은 것을 아키타입이라 한다)


앞서 말했듯 ECS 아키텍쳐는 ID(엔터티_),데이터(컴포넌트), 및 동작(시스템)으로 분리된다. 이 아키텍쳐는 데이터에 중점을 두고, 시스템은 구성 요소의 데이트 스트림을 읽은 다음 입력 상태에서 출력상태로 변환 엔터티는 이를 색인화 한다. 이로 인해 이를 데이터 지향 프로그래밍이라고 한다.


그리고, 컴포넌트 유형의 고유 조합을 엔터티 아키타입이라고 하는데, 각 인스턴스 자체는 단일 엔터티에 해당하지만 동일한 컴포넌트 조합을 가지고 있으므로 이를 단일타입이라고 분류한다.


엔터티의 아키타입은 엔터티의 컴포넌트가 저장되는 위치를 결정하는데, ECS는 청크 형태로 메모리를 할당, 각 청크는 아키타입 청크 객체로 표시된다. 

이러한 블록에는 항상 엔터티 단일 아키타입이 포함된다. 메모리 블록이 가득차면 ECS는 동일한 아키타입을 사용하여, 생성된 모든 새 엔터티에 대해 새 메모리 블록을 할당함


따라서, 아키타입과 블록간의 일대 다 관계를 제공한다고 볼 수 있는데, 구성 요소 집합이 있는 모든 엔터티를 찾는데 일반적으로 숫자가 훨씬 더 많은 모든 엔터티가 아니라 일반적으로 숫자가 작은 기존 아키텍쳐만 검색하면 된다는 것이다.