본문 바로가기
개발/Unity

[Unity][DOTS] ECS & C# Job System, 샘플 프로젝트 따라잡기 #1

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

유니티의 Entity Component System & C# Job System 샘플 프로젝트를 파헤쳐보겠다.

Entity Component System(이하 ECS)과 C# Job System이 뭔지 먼저 얘기하는게 순서지만 이 글이 우선순위가 높다고 판단하여 먼저 쓴다. 그래도 간단히 얘기하자면 Entity Component System은 유니티 새로운 개발 패러다임으로 객체 지향 프로그래밍에서 데이터 지향 프로그래밍으로의 전환을 돕는다. 아직 실험적인 단계로 유니티 2018.3 이상 버전에서 사용할 수 있다. C# Job 시스템은 멀티쓰레딩을 쉽게 구현할 수 있도록 도와주는 시스템이다. ECS가 Package Manager로 수동 설치해야 하는데에 비해 Job System은 유니티 2018.1 버전부터 엔진에 내장(built-in)돼 있다.

샘플 프로젝트는 https://github.com/Unity-Technologies/EntityComponentSystemSamples에서 받아볼 수 있다. 프로젝트 이름이 " Entity Component System and C# Job System samples"였는데 최근에 "DOTS Samples"로 이름이 변경됐다. DOTS는 Data Oriented Tech Stack의 약자다. DOTS에 대한 자세한 설명은 https://unity.com/dots에서 확인할 수 있다.

샘플 프로젝트는 ECS의 기초를 다루는 HelloECS와 좀 더 복잡한 내용을 다루는 Advanced로 나뉜다.

 

 

HelloECS는 다시 HelloCube_01_ForEach, HelloCube_02_IJobProcessComponentData, HelloCube_03_IJobChunk, HelloCube_04_SubScene, HelloCube_05_SpawFromMonoBehaviour, HelloCube_04_Spawne 이렇게 6개의 씬(scene)으로 이뤄져있다. 일단 대략적으로 설명하고 각 씬에 대한 자세한 설명은 다음 포스트에서 다루겠다.

  • HelloCube_01_ForEach
    • 두 개의 Cube를 생성하고 회전시키는 것으로 ECS 시스템을 설명하는 아주 간단한 씬이다. 기존에 한 몸이었던 데이터(data)와 로직(functionality)이 componet와 system으로 나뉘는 개념을 설명한다. 데이터는 ECS componet에 저장되고, 로직은 ECS의 system이 담당한다. 멀티쓰레드를 사용하지 않고 하나의 메인 쓰레드에서 작동한다. IComponentData 인터페이스에 따라 구현된 RotationSpeed 구조체, ComponentSystem을 상속 받은 RotationSpeedSystem 클래스를 사용한다.
  • HelloCube_02_IJobProcessComponentData
    • 첫번째 씬에 C# Job System이 추가됐고 멀티 쓰레드 하에 동작한다. IJobProcessComponentData 인터페이스에 따라 구현된 RotationSpeedJob 구조체와 JobComponentSystem을 상속 받은 RotationSpeedSystem 클래스를 사용한다.
  • HelloCube_03_IJobChunk
    • 두번째 씬에 정크(chunk)라는 개념이 추가됐다. 정크는 16kb의 연속된 메모리 블럭이다. IJobChunk 인터페이스에 따라 구현된 RotationSpeedSystem 클래스를 사용한다. 정크에는 component 배열이 저장되고 이를 통한 반복(iterate)을 구현함으로써 성능 향상을 꾀할 수 있다.

나머지 씬들과 각 씬의 코드 분석은 다음 포스트에서 다루겠다.

반응형

댓글