엔티티 컴포넌트 시스템
Entity component system![]() |
엔티티 컴포넌트 시스템(ECS)은 게임 월드 오브젝트를 표현하기 위한 비디오 게임 개발에서 주로 사용되는 소프트웨어 아키텍처 패턴입니다.ECS는 데이터의 구성요소로 구성된 엔티티와 엔티티의 구성요소에서 작동하는 시스템으로 구성됩니다.
ECS는 상속보다 구성 원칙을 따릅니다.즉, 모든 엔티티는 유형 계층이 아니라 관련된 컴포넌트에 의해 정의됩니다.시스템은 필요한 컴포넌트를 가진 모든 엔티티에 대해 글로벌하게 동작합니다.
특성.
엔티티: 엔티티는 범용 객체를 나타냅니다.예를 들어 게임 엔진 컨텍스트에서는 모든 거친 게임 오브젝트가 실체로서 표현된다.보통 하나의 ID로만 구성됩니다.실장에서는,[1] 통상, 이것에 플레인 정수를 사용합니다.
컴포넌트: 컴포넌트는 특정 측면을 가진 것으로 간주되는 엔티티에 라벨을 붙이고 해당 측면을 모델링하는 데 필요한 데이터를 보유합니다.예를 들어 피해를 줄 수 있는 모든 게임 개체에는 해당 개체와 연결된 상태 구성 요소가 있을 수 있습니다.구현에서는 일반적으로 구조체, 클래스 또는 연관 [1]배열을 사용합니다.
시스템: 시스템은 원하는 컴포넌트를 가진 모든 엔티티에 작용하는 프로세스입니다.예를 들어 물리 시스템은 질량, 속도 및 위치 구성요소를 가진 실체를 쿼리하고 각 실체에 대한 구성요소 집합에 대해 물리 계산을 수행하는 결과를 반복할 수 있습니다.
엔티티의 동작은 컴포넌트를 추가, 삭제 또는 수정하는 시스템에 의해 런타임에 변경될 수 있습니다.이를 통해 객체 지향 프로그래밍 기법에서 종종 볼 수 있는 깊고 광범위한 상속 계층의 모호성 문제를 해결하여 이해, 유지 및 확장이 어렵습니다.일반적인 ECS 접근 방식은 데이터 지향 설계 기법과 호환성이 높으며, 종종 데이터 지향 설계 기법과 결합됩니다.컴포넌트의 모든 인스턴스의 데이터는 일반적으로 물리 메모리에 함께 저장되므로 많은 엔티티에서 작동하는 시스템에서 효율적으로 메모리에 액세스할 수 있습니다.
역사
2007년 Flashpoint: Dragon Rising 운영 팀은 Bilas/Dungeon Sieve에서 영감을 받은 설계를 포함한 ECS 설계를 실험했고, Adam Martin은 나중에 핵심 용어와 [3]개념의 정의를 포함한 ECS [2]설계에 대한 자세한 설명을 작성했습니다.특히 마틴의 연구는 시스템의 아이디어를 1등급 요소로, 실체를 식별자로, 구성 요소를 원시 데이터로, 그리고 구성 요소나 실체가 아닌 시스템에 저장되는 코드를 대중화했습니다.
2015년 애플은 iOS, macOS, tvOS 게임 개발용 API 프레임워크인 GameplayKit를 도입하여 ECS를 [4]구현하였습니다.
2018년 8월 Sander Mertens는 인기 있는 Flecs ECS [5]프레임워크를 만들었습니다.
2018년 10월[6] Unity는 ECS를 기반으로 구축된 기술 스택을 활용한 메가시티 데모를 발표했습니다.모든 자동차, 네온사인 등에 하나씩 100,000개의 오디오 소스가 있어 크고 복잡한 사운드스케이프를 만들었습니다.[6]
바리에이션
서로 다른 ECS의 데이터 레이아웃은 구성요소의 정의, 구성요소가 엔터티와 어떻게 관련되어 있는지 및 시스템이 엔터티의 구성요소에 액세스하는 방법뿐만 아니라 다를 수 있습니다.
마틴의 ECS
Adam Martin의 인기 있는 블로그 시리즈는 엔티티 컴포넌트 시스템에 [3]대해 다음과 같이 정의하고 있습니다.
엔티티는 컴포넌트에 액세스하기 위한 ID로만 구성됩니다.각 엔티티에 대해 고유한 ID를 사용하는 것이 일반적입니다.이것은 요건은 아니지만 다음과 같은 장점이 있습니다.
- 포인터 대신 ID를 사용하여 엔티티를 참조할 수 있습니다.이것은 엔티티가 매달리는 포인터를 남기지 않고 파괴될 수 있기 때문에 더욱 강력합니다.
- 외부적으로 상태를 저장하는 데 도움이 됩니다.상태가 다시 로드되면 포인터를 재구성할 필요가 없습니다.
- 데이터는 필요에 따라서 메모리내에서 교환할 수 있습니다.
- 엔티티 ID는 네트워크를 통해 통신할 때 엔티티를 일의로 식별하기 위해 사용할 수 있습니다.
이러한 장점 중 일부는 스마트 포인터를 사용하여 달성할 수도 있습니다.
컴포넌트 내부에 게임 코드(동작)가 없습니다.구성요소는 엔티티와 물리적으로 함께 위치할 필요는 없지만 엔티티를 사용하여 쉽게 찾고 액세스할 수 있어야 합니다.
"각 시스템은 (각 시스템이 자체 개인 스레드를 가지고 있는 것처럼) 지속적으로 실행되며 시스템 쿼리에 일치하는 컴포넌트를 소유한 모든 엔티티에 대해 글로벌 액션을 수행합니다."
유니티 게임 엔진
Unity 레이아웃에는 각각 컴포넌트 열이 있는 테이블이 있습니다.이 시스템에서 엔티티 유형은 엔티티가 보유하고 있는 컴포넌트를 기반으로 합니다.모든 엔티티 유형에 대해 엔티티에서 사용되는 컴포넌트와 일치하는 컴포넌트의 열을 포함하는 테이블(아키타입이라고 함)이 있습니다.특정 엔티티에 액세스하려면 각 컬럼에서 올바른 원형(표)과 인덱스를 찾아 해당 엔티티에 대응하는 각 컴포넌트를 가져와야 합니다.
기기 ECS
기기는 Unreal Engine용 서드파티 ECS 구현으로 일반적인 ECS 패러다임에 몇 가지 추가 기능을 도입했습니다.이러한 기능 중 하나는 구성 요소에 대한 유형 계층의 지원입니다.각 컴포넌트는 OOP와 마찬가지로 기본 컴포넌트 유형(또는 기본 클래스)을 가질 수 있습니다.그런 다음 시스템은 기본 클래스를 쿼리하고 결과 엔티티 선택에서 모든 하위 클래스를 일치시킬 수 있습니다.이것은 몇 가지 공통 로직이 다른 컴포넌트 집합에서 구현될 때 매우 유용할 수 있으며 패러다임에 추가 차원을 추가합니다.
ECS 사용의 일반적인 패턴
시스템 간에 데이터를 전송하는 일반적인 방법은 데이터를 컴포넌트에 저장한 후 각 시스템이 컴포넌트에 순차적으로 액세스하도록 하는 것입니다.예를 들어 오브젝트의 위치를 정기적으로 갱신할 수 있습니다.이 위치는 다른 시스템에서 사용됩니다.빈도가 낮은 이벤트가 많은 경우 하나 이상의 컴포넌트에 많은 플래그가 필요합니다.그러면 시스템은 반복할 때마다 이러한 플래그를 모니터링해야 하므로 비효율적일 수 있습니다.해결책은 옵서버 패턴을 사용하는 것입니다.이벤트에 종속된 모든 시스템이 이벤트에 가입합니다.따라서 이벤트로부터의 액션은 발생할 때 한 번만 실행되며 폴링은 필요하지 않습니다.
ECS 아키텍처는 컴포넌트가 단순한 데이터 버킷이기 때문에 객체 지향 프로그래밍에서 흔히 볼 수 있는 의존성 문제에 문제가 없습니다.일반적으로 각 시스템은 시스템이 운영되기 위해 엔터티가 갖춰야 할 컴포넌트 세트를 쿼리합니다.예를 들어 렌더링 시스템은 모델, 변환 및 그리기 가능한 구성요소를 등록할 수 있습니다.실행 시 시스템은 이러한 모든 컴포넌트를 가진 모든 엔티티에 대해 논리를 수행합니다.다른 엔티티는 단순히 건너뜁니다.복잡한 의존관계 트리는 필요 없습니다.그러나 컴포넌트를 통해 시스템 간에 값을 전파하면 디버깅이 어려워지므로 버그를 숨길 수 있습니다.ECS 는, 분할되지 않은 데이터를 소정의 라이프 타임에 바인드 할 필요가 있는 경우에 사용할 수 있습니다.
ECS 아키텍처에서는 상속 트리가 아닌 구성을 사용합니다.엔티티는 일반적으로 ID와 엔티티에 연결된 컴포넌트 목록으로 구성됩니다.엔티티에 올바른 컴포넌트를 추가하면 게임 오브젝트를 만들 수 있습니다.이를 통해 개발자는 종속성 문제 없이 한 개체의 기능을 다른 개체에 쉽게 추가할 수 있습니다.예를 들어, 플레이어 엔티티가 총알 컴포넌트를 추가한 후 어떤 총알 핸들러 시스템에 의해 조작되어야 하는 요건을 충족할 수 있습니다.이 경우 플레이어는 총알 컴포넌트에 부딪혀서 물건에 손상을 입힐 수 있습니다.
게임 상태를 저장하기 위해 ECS를 사용하는 것의 장점은 Adam Martin과 같은 많은 게임 개발자들에 의해 선언되어 왔다.좋은 예로는 Richard Lord가 블로그에 올린 글에서 ECS가 설계한 게임 데이터 스토리지 시스템의 장점과 [7]그 유용성에 대해 설명합니다.
토론.
"시스템"은 일등석입니까?
이 문서에서는 ECS를 엔티티, 컴포넌트 및 시스템이라는3개의 퍼스트클래스로 이루어진 소프트웨어 아키텍처 패턴으로 정의합니다.
그러나 영어의 모호성 때문에 ECS는 엔티티와 컴포넌트로 이루어진 시스템이라는 것이 일반적인 해석이다.예를 들어, GDC에서 [8]열린 2013년 강연에서 Scott Bilas는 C++ 객체 시스템과 새로운 맞춤형 구성 요소 시스템을 비교했습니다.이는 일반적인 시스템 엔지니어링에서 일반적인 Lisp 객체 시스템 및 유형 시스템을 예로 들어 시스템 용어를 사용하는 것과 일관됩니다.따라서, 「시스템」의 제1종으로서의 아이디어는, 논쟁의 여지가 있습니다.
그러한 기업-요소 구조의 실질적인 차이는 요소 및/또는 실체에 행동이 정의된다는 것이다.이것은 응용 프로그램에 따라 어느 정도 적합하도록 트레이드오프가 있습니다.
이 글에서 모호함을 피하기 위해 "Entity Component System"이라는 단어에 "framework" 또는 "architecture"와 같은 명사를 붙입니다."시스템"이라는 단어는 이 맥락에서 단수이다.
ECS는 유용한 개념입니까?
ECS는 일반 컴퓨터 과학과 프로그래밍 언어 이론에서 직교적이고 확립된 아이디어를 결합합니다.예를 들어 컴포넌트는 다양한 프로그래밍 언어에서 혼합된 관용어로 볼 수 있습니다.컴포넌트는 일반적인 위임(개체 지향 프로그래밍) 접근법 및 메타 객체 프로토콜에 따른 특수한 케이스입니다.즉, 객체 지향 프로그래밍의 올란도[9] 조약 비전 내에서 템플릿과 공감 모델을 사용하여 완전한 컴포넌트 객체 시스템을 표현할 수 있습니다.그러나 개념의 이론적인 효용이 무엇이든 엔티티 컴포넌트 시스템 프레임워크의 광범위한 사용은 특히 게임 프로그래밍에서 그 실용적 효용에 이론의 여지가 없다.
「 」를 참조해 주세요.
레퍼런스
- ^ a b "Entity Systems Wiki". Archived from the original on 31 December 2019. Retrieved 31 December 2019.
- ^ Martin, Adam. "Entity Systems are the Future of MMOG Development". Archived from the original on 26 December 2013. Retrieved 25 December 2013.
- ^ a b Martin, Adam. "Entity Systems are the Future of MMOG Development Part 2". Archived from the original on 26 December 2013. Retrieved 25 December 2013.
- ^ "Introducing GameplayKit - WWDC 2015 - Videos". Archived from the original on 2017-10-06. Retrieved 2017-10-06.
- ^ "SanderMertens - Overview". GitHub. Retrieved 2021-09-06.
- ^ a b "Unity unleashes Megacity demo - millions of objects in a huge cyberpunk world". MCV/DEVELOP. 2018-10-24. Retrieved 2021-06-24.
- ^ "Why use an Entity Component System architecture for game development?". www.richardlord.net. Retrieved 2021-11-18.
- ^ Bilas, Scott. "A Data-Driven Game Object System" (PDF). Archived (PDF) from the original on 18 September 2013. Retrieved 25 December 2013.
- ^ Lynn Andrea Stein, Henry Liberman, David Ungar: 공유에 대한 공통된 견해: 올란도 조약.In: Won Kim, Frederick H. Rochovsky (Ed.) : 객체 지향 개념, 데이터베이스, 응용 프로그램 ACM Press, New York 1989, ch.31-48 ISBN 0-201-14410-7 (Wayback Machine에서 온라인 아카이브 2016-107 )