DOTS 알아보기

Tutorial

intermediate

+10XP

15 mins

15

Unity Technologies

DOTS 알아보기

이 튜토리얼에서 배울 내용은 다음과 같습니다.

  • Unity DOTS(데이터 지향 기술 스택)의 구성 요소를 살펴봅니다.
  • DOTS가 유용하게 사용되는 사례를 파악합니다.

Languages available:

1. 개요

사용자에게 몰입감과 반응성이 뛰어난 경험을 제공하는 애플리케이션을 제작할 때 CPU와 메모리 성능은 깊게 고민해야 하는 부분입니다. Unity의 DOTS(데이터 지향 기술 스택)는 Unity 개발자가 하드웨어 특성과 제약 조건을 최대한 활용할 수 있도록 지원하는 소프트웨어 아키텍처입니다.

DOTS는 Unity에서의 새로운 작업 방식을 대표하는 기술을 조합해 놓은 모음입니다. OOP(객체 지향 프로그래밍) 접근 방식과 달리 DOD(데이터 지향 디자인)를 사용하며 코드와 데이터에 중점을 둔 접근 방식이기도 합니다. DOTS를 사용하면 멀티코어 프로세서를 활용하여 데이터 처리를 병렬화할 수 있을 뿐 아니라 보다 성능이 뛰어나고 타켓 하드웨어에 적합한 애플리케이션을 만들 수 있습니다.

이 튜토리얼은 DOTS를 처음 접하는 기술 전문가와 비기술 전문가 모두에게 DOTS에 대한 기초 지식을 제공하고 DOTS 학습의 기본 단계에서 흔히 가질 수 있는 궁금증을 해소합니다.

기능 및 패키지

Unity DOTS(데이터 지향 기술 스택)는 다음과 같이 고성능 CPU 코드 작성을 용이하게 하는 기능과 패키지를 모아 놓은 것입니다.

  • C# 잡 시스템을 활용하면 멀티 스레드 코드를 쉽고 안전하게 작성함으로써 최신 CPU의 수많은 코어를 활용할 수 있습니다.
  • 버스트 컴파일러는 Mono나 ILCPP보다 훨씬 빠른 코드를 생성하는 최적화 C# 컴파일러입니다.
  • Unity.Mathematics 패키지는 버스트 컴파일된 코드에서 사용할 때 특별히 최적화된 수학 라이브러리를 제공합니다.
  • Unity.Collections 패키지는 목록과 해시 맵 같은 일반적인 컬렉션 유형을 제공합니다. 일반 C# 컬렉션과 달리 이러한 컬렉션은 관리되지 않으므로 버스트 컴파일된 코드에서 사용할 수 있습니다. 또한 잡에서 안전하게 사용될 수 있도록 안전성 검사를 지원합니다.
  • Unity.Entities 패키지는 ECS(엔티티 컴포넌트 시스템) 아키텍처의 형태를 제공합니다. 즉, 엔티티는 게임 오브젝트보다 가볍고 효율적인 대체제이며 시스템이라는 코드 단위로 처리됩니다.
  • Unity.Entities.Graphics 패키지는 URP(유니버설 렌더 파이프라인) 또는 HDRP(고해상도 렌더 파이프라인)를 사용하여 엔티티를 렌더링합니다.

일부 다른 패키지는 엔티티와 나머지 DOTS 코어에 기반하여 구축되었습니다.

  • Unity.Physics 패키지는 결정론적 리지드바디 동역학 시스템과 공간 쿼리 시스템을 제공합니다.
  • Unity.Netcode 패키지(Netcode for Entities라고도 함)는 권한 서버와 클라이언트측 예측이 포함된 네트워크 멀티플레이어 기능을 제공합니다.

현재 Unity에 애니메이션, 오디오, UI에 관한 엔티티 기반 솔루션은 마련되어 있지 않으므로, 엔티티 기반 프로젝트에서 해당 기능을 개발할 때는 게임 오브젝트나 다른 대안에 의존해야 합니다. 예를 들어 애니메이션이 적용된 몬스터가 등장하는 엔티티 기반 게임을 제작하는 경우, 시뮬레이션 로직에서는 몬스터를 엔티티로 표현할 수 있지만 결국 게임 오브젝트로 렌더링해야 합니다. 이를 위해서는 각 몬스터 엔티티와 해당 게임 오브젝트 간의 상태 동기화가 필요하지만 스케일이 크지 않으면 허용 가능한 수준의 오버헤드입니다.

2. DOTS의 주요 개념

아래 동영상에서는 DOTS의 가장 핵심적인 개념을 간단히 소개합니다.

C# 잡 시스템(11분 - YouTube)

ECS 엔티티와 컴포넌트(10분 - YouTube)

ECS 시스템(7분- YouTube)

3. 현재 프로젝트에 DOTS를 사용해야 할까요?

사용자 코드에 CPU 병목 현상이 있는 프로젝트는 느린 코드를 버스트 컴파일된 잡으로 다시 구현하는 것을 고려해야 합니다. 버스트 컴파일된 코드는 Mono 또는 IL2CPP로 컴파일된 코드보다 몇 배 더 빠르게 실행될 뿐만 아니라 잡을 통해 CPU의 모든 코어에 워크로드를 분할할 수 있습니다.

프로젝트가 기존에 DOTS를 사용하지 않더라도 버스트 컴파일된 잡은 기존 프로젝트에 비교적 쉽게 통합할 수 있습니다. Unity.Collections 유형 안팎으로 데이터를 복사해야 할 수도 있지만 그 외에는 버스트 컴파일된 잡을 추가하기 위해 복잡하게 코드를 재구성할 필요가 없습니다.

Entities 패키지도 마찬가지입니다. 특정 기능만 구현하기 위해 엔티티를 선택적으로 통합할 수 있지만 ECS 아키텍처는 자체 코드 구조를 적용하므로 보통은 전체 프로젝트의 기초를 형성하는 데 사용됩니다.

새 프로젝트를 엔티티 기반으로 만들 만한 네 가지 이유는 다음과 같습니다.

  • 프로젝트에는 크고 상세한 환경을 렌더링하는 다양한 정적 요소가 있습니다. 메가시티(Megacity) 샘플을 예로 들자면, 엔티티로 구성된 복잡한 환경을 확인할 수 있습니다(메가시티 프로젝트 동영상 보기).
  • 여러분의 프로젝트에는 컴퓨팅 리소스가 많이 필요한 동적 요소가 많습니다. 예를 들어 실시간 전략 게임에서는 수백 또는 수천 개의 유닛에 대한 경로 탐색을 계산해야 하는 경우가 많습니다.
  • 데이터와 코드를 구성하는 데 ECS 방식을 선호합니다. 일반적인 OOP 방식보다 추론 및 유지 관리가 더 쉽기 때문입니다.
  • 슈팅 게임처럼 빠른 액션이 동반되는 경쟁식 멀티플레이어 게임을 만들 경우, 좋은 플레이어 경험을 위해서는 권한 서버와 클라이언트측 예측이 필요합니다. (이러한 기능은 Netcode for Entities에서만 지원되고 Netcode for GameObjects에서는 지원되지 않습니다.)

4. 이 교육 과정의 튜토리얼

이 교육 과정의 세 가지 튜토리얼에서는 엔티티와 잡 시스템의 기본 사용법을 다룹니다.

첫 번째 튜토리얼인 ‘Unity 잡 시스템 시작하기’에서는 C# 잡 시스템, 버스트, Unity.Collections, Unity.Mathematics를 사용하여 CPU의 복잡한 계산과 관련된 문제를 해결하기 위한 고성능 솔루션을 만드는 방법을 보여 줍니다.

두 번째 튜토리얼인 ‘HelloCube로 엔티티 학습’에서는 엔티티를 생성하고 조작하는 매우 기본적인 예제를 살펴봅니다.

세 번째 튜토리얼인 ‘엔티티 활용: 탱크’에서는 대포가 움직이면서 포탄을 발사하는 매우 간단한 시뮬레이션을 소개합니다.

5. 더 많은 리소스

DOTS에 대한 자세한 내용은 Unity.com 웹사이트의 DOTS 페이지를 참조하세요.

Complete this Tutorial