Unity DOTS 개요

정선호·2023년 6월 26일

Unity Dots

목록 보기
2/3

강의 영상

DOTS가 유용한 상황

  • 수많은 엔티티들의 로드
    • 모든 엔티티들이 플레이어한테 컨드롤되거나 서로 혹은 월드와 상호작용을 해야 할 때
  • 복잡한 알고리즘
    • 절차적 생성, 패스파인딩, 동적 AI, 복잡한 물리연산 등
  • 경쟁형 멀티플레이어 게임
    • 네트워크 속도와 정확성이 매우 중요한 상황에서
  • 게임 외적 상황에서
    • 디지털 트윈, 큰 스케일의 시뮬레이션
  • 성능이 중요한 장비들
    • 모바일 기기, VR 기기 등

DOTS의 패키지들 목록

  • Entities(ECS)
  • Entities Graphics
  • Netcode for Entities
  • Physics
  • Jobs
  • Collections
  • Burst
  • Mathematics

Entities(ECS)

DOTS의 가장 핵심적인 패키지.
데이터 지향 설계 원칙을 사용해 데이터를 게임 로직에서 분리시킨다. 이는 더 모듈화되고 변화에 유연한 효율적인 데이터 및 코드베이스 처리를 수행한다.

엔티티 컴포넌트 시스템(ECS)는 엔티티(Entity), 컴포넌트(Component), 시스템(System) 세 개의 요소로 이루어져 있다.

  • 엔티티(Entity)
    • 게임월드 내의 무언가(A Thing)
    • 사실 별 것 아님
    • 데이터 컴포넌트들의 그룹
    • 하나의 무언가, 여러 개의 무언가, 무언가의 일부분을 대표한다
    • 인덱스와 버전 넘버를 갖고 있다.
  • 컴포넌트(Component)
    • 데이터(Data)
    • 데이터 지향 설계의 핵심
    • 엔티티에 연관된 실제 데이터
      ex)엔티티의 월드 내 포지션 등
    • 청크들에 저장된 비관리 데이터(Unmanaged Data)
      메모리 영역에 일렬로 저장되어 게임이 메모리를 빠르게 읽을 수 있게 해준다.
    • C# Job System과 Burst Compiler와 간편하게 합쳐진다.
  • 시스템(System)
    • 데이터 변환(Data Transformation)
    • 게임플레이가 발생하도록 데이터를 변환해준다
    • 특정 데이터 컴포넌트들을 가지는 엔티티들의 그룹들 위에서 자동으로 실행된다.
    • 시스템 자체는 메인 스레드 위에서만 실행되지만 C# Job System을 이용해 워커 스레드들을 만들어 동시에 작동시킬 수 있다.

ECS는 데이터를 메모리에 효율적으로 배치하는 기법일 뿐이다. 멀티스레딩은 C# Job System에서 담당하게 된다.

Entities Graphics

엔티티들을 게임월드 내에 렌더링해주는 패키지
URPHDRP에서 사용 가능하다.

ECS를 사용해도 기존 GameObject를 사용해 프론트엔드 비주얼을 구현하면 해당 패키지는 필요없다.
하지만 엔티티들은 거의 대부분 해당 패키지를 이용해 그래픽을 렌더링한다.

Netcode for Entities

ECS에 호환되는 멀티플레이어 네트워킹 시스템
네트워크 속도와 정확성이 매우 중요한 경쟁적 멀티플레이 시스템에서 매우 유용하게 사용 가능

서버에서 플레이어의 치팅 여부를 판별하는 등 서버의 권한이 강한 게임에서 유용하다.

넷코드에 따른 플레이어 통신 오차를 각각의 클라이언트에서 자신의 위치 등을 예측하여 보내는 기능을 편리하게 구현할 수 있다.

만약 예측 실패 등의 이유로 다른 클라이언트 간에 차이가 날 시 시뮬레이션 롤백(Simulated Rollback)을 할 수 있다. 모든 것이 순수 데이터이기 때문에 몇 틱 이전 데이터로 롤백한 후 다시 재시뮬레이션 할 수 있다.

64명 이상이 동시에 참여할 수 있는 메가시티 멀피틀레이어 샘플을 유니티 홈페이지에서 받아볼 수 있다.

Physics

DOTS PhysicsHavok Physics가 있다. DOTS Physics는 모든 유니티 유저가, Havok Physics는 유니티 프로 이상 구독자들이 사용할 수 있다.

  • Dots Physics

    • 모든 물리 오브젝트의 물리적 상태 체크를 실시간으로 하지 않는 물리엔진이다.
      엔진이 알려주는 것은 이벤트 자체이므로 일반 유니티의 OnCollisionEnter/Stay/Exit등 물리적 상태에 대한 호출을 개발자가 직접 만들어야 한다.
    • 물리적 상태 체크를 하지 않으므로 서버와 클라이언트간의 통신 종류가 줄어들기 때문에 멀티플레이어 게임 구현에 유리하며 시뮬레이션 롤백도 상태 체크 물리 엔진에 비해 쉽게 실행할 수 있다.
    • 내장된 공간탐지 기능(Built-in Spatial Querying)을 제공해 특정 엔티티 주변 다른 엔티티들을 찾기 편리하다.
  • Havok Physics

    • 업계 표준 물리엔진, DOTS Physics와 서로 변경이 가능하다.
    • 물리 상태 체크 시스템을 갖고 있어 멀티플레이 게임에 불리하다.
    • 매우 정밀한 물리적 작업이 가능함

C# Job System

유니티에서 멀티스레딩을 구사하는 방법 중 하나이다.
레이스 컨디션 등 멀티스레딩의 이슈들을 회피하기 위해 자동으로 스케줄링과 안전 체크를 해준다
많이, 자주 사용되거는 명령 처리 및 무거운 연산 처리에 사용하기 좋다

한 프레임 안에 멀티스레딩 작업을 완료함을 의도하고 구현되었다.
따라서 여러 프레임에 걸쳐 오랫동안 작업을 할 시에는 코루틴 혹은 비동기를 사용한다.

해당 시스템은 비관리 데이터 타입에게만 사용할 수 있다.
버스트 컴파일러로 컴파일할 수 있다.
ECSMonoBehaviour 둘 다 사용할 수 있다.

Collections

비관리 데이터 구조체들로 Jobs와 Burst Compiler에서 사용할 수 있다.
C/C++의 데이터 구조체들과 유사한 구조로, 개발자가 직접 메모리를 할당 및 해제해야 한다.
내장된 세이프티 체크가 있어 미리 경고를 던져준다.

컬렉션 종류들은 다음과 같다.

  • NativeArray : 배열
  • NativeList : 리스트
  • NativeQueue : 큐
  • NativeHashMap : 해시맵
  • Unsafe Collections : 세이프티 체크가 해제된 컬렉션들
  • 기타 등등...

Burst Compiler

사용자가 작성한 C#코드를 네이티브 CPU코드로 컴파일해준다.
C# Job System을 적용한 코드를 더욱 빠르게 작동시켜준다.

Mathematics

버스트 컴파일러와 호환되는 수학적 구조들을 가진 패키지이다.

  • Vector3 -> float3
  • Quaternion -> quaternion

유니티에서 자주 사용하는 수학 연산들 또한 포함되어 있다. 다만 연산 이름이 조금씩 다르다.

  • Vector3.Magnitude -> math.Length(float3)

DOTS에 대한 말들

ECS를 사용하면 좋은 상황

  • 많은 수의 개체가 CPU에 의해 컨트롤되어야 할 때
  • 경쟁 멀티플레이 게임
  • 성능 집약이 필요한 기종 및 기기에
  • 데이터 지향 디자인을 하고 싶을 때

ECS를 사용하면 안 되는 상황

  • 개발한 게임이 성능적으로 문제가 없을 때
  • 처음으로 유니티를 개발할 때
  • 그냥 새 거라고 하고 싶을 때
    • 게임오브젝트 방식이 더 사용하기 쉽고, 더 많은 리소스와 애셋을 갖고 있음

ECS를 사용하지 않아도

  • DOTS패키지는 계속 사용할 수 있다
  • 넷코드나 피직스는 ECS를 요구한다
  • Jobs와 Burst는 ECS 없이도 높은 성능 향상을 일군다
  • ECS베이스로 게임을 구현하지 않았어도 특정 상황에서 ECS를 사용할 수 있다.

DOTS의 단점

  • 아직 미해결된 에러들이 남아있다
  • 에러 메시지가 모호한 부분이 있다
  • 저레벨 컴퓨팅과 데이터 지향 디자인, 새 API를 학습하는 데 시간과 노력이 필요하다
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글