Unity DOTS (1)

JJW·2025년 2월 16일
0

Unity

목록 보기
23/34
  • 오늘은 Unity DOTS에 대해 학습하고 구현해보며
    1편에서는 개념과 정의에 대해 학습하며 2편에서는 구현해보도록 하겠습니다.

  • Unity Dots Tip
    How to Convert a Game to Dots

  • Unity Dots
    Unity DOTS(1)
    Unity DOTS(2)

  • Dots란 ?
    ➡️ Unity에서 제공하는 데이터 중심 설계 패러다임으로, 성능과 확장성을 극대화하기 위해 만들어진 기술 스택입니다. 기존의 객체 지향 방식과 달리, DOTS는 데이터를 효율적으로 조직하고 처리하는 데 맞춰져있습니다.


주요 구성 요소

ECS (Entity Component System)

Entity

➡️ 게임 내의 개별 객체를 식별하는 ID 또는 핸들입니다.
➡️ 엔티티 자체는 아무런 데이터도 가지고 있지 않고 오직 컴포넌트를 통해 데이터를 부여받습니다.

Component

➡️ 엔티티에 부착되는 순수 데이터 구조체입니다.
➡️ 예를 들어, 위치, 속도 같은 정보들을 담습니다.
➡️ 중요한 점은 순수 데이터라는 점입니다. 컴포넌트에는 로직이 없어 메모리 상에서 연속된 데이터 배열로 저장될 수 있어 캐시 효율이 극대화됩니다.

System

➡️ 컴포넌트를 가진 엔티티들을 대상으로 데이터를 처리하는 로직을 실행합니다.
➡️ 각 시스템은 특정 컴포넌트 집합을 대상으로 독립적으로 실행되며, 데이터 중심으로 작업을 수행합니다.
➡️ 이를 통해 서로 다른 시스템 간의 의존성을 최소화하고, 병렬 처리가 용이해집니다.

ECS의 장점

➡️ 캐시 효율성: 컴포넌트 데이터를 연속적인 메모리 블록에 배치하여, CPU 캐시 미스를 줄입니다.
➡️ 확장성: 수천에서 수만 개의 엔티티를 효율적으로 관리하고 처리할 수 있습니다.
➡️ 유지보수성: 데이터와 로직을 분리하여 관리하기 때문에, 코드의 모듈성과 테스트가 용이합니다.


Job System

개념 및 목적

➡️ Job System은 Unity가 제공하는 멀티스레딩 솔루션입니다.
➡️ CPU의 여러 코어를 활용하여 작업을 병렬로 처리함으로써 메인 스레드의 부하를 줄이고 성능을 높입니다.

사용 방법

  • Job 작성
    ➡️ Job은 보통 구조체로 작성되며 IJob, IJobParallelFor, IJobEntity 등의 인터페이스를 구현합니다.
    ➡️ 각 Job은 Execute() 메서드를 통해 수행할 작업을 정의합니다.

  • Job 스케줄링
    ➡️ Schedule() 또는 ScheduleParallel() 메서드를 호출하여 Job을 실행합니다.
    ➡️ Job 간의 의존성은 Unity가 자동으로 관리하여, 데이터 경합이나 동기화 문제를 최소화합니다.


Burst Compiler

개념 및 목적

➡️ Burst Compiler는 C# 코드를 네이티브 코드 수준으로 최적화해주는 컴파일러입니다.
➡️ LLVM 기반의 기술을 사용해 벡터화, 인라이닝, 루프 최적화 등 다양한 저수준 최적화를 수행합니다.

  • LLVM이란 ?

    • LLVM은 "Low Level Virtual Machine"의 약자로
      이름과는 달리 실제 가상 머신보다는 컴파일러와 툴체인의 기반 기술을 제공하는 프로젝트입니다.
      소스 코드를 기계가 이해할 수 있는 언어로 변환하는 컴파일러의 역할을 넘어서, 코드의 분석과 변환, 최적화를 위한 프레임워크를 제공합니다.
      LLVM은 다양한 프로그래밍 언어와 플랫폼을 지원하며, 소프트웨어의 성능을 향상시키고 개발 과정을 간소화하는 데 중요한 역할을 합니다.

사용 방법

➡️ 코드나 Job에 [BurstCompile] 어트리뷰트를 붙이면 Burst가 해당 코드를 분석하여 최적화된 네이티브 코드를 생성합니다.
➡️ 특히 수학적 계산이나 반복 작업이 많은 Job에서 성능 향상을 크게 볼 수 있습니다.

장점

➡️ 동일한 C# 코드가 일반적인 실행 방식보다 몇 배 빠른 실행 속도를 보여줍니다.
➡️ 멀티코어 환경에서 Job System과 함께 사용하면, 높은 처리량과 낮은 지연 시간을 달성할 수 있습니다.


DOTS의 작동 원리와 이점

데이터 중심 설계

  • 데이터 구조 최적화
    • DOTS는 데이터를 중심으로 시스템을 설계하기 때문에, 메모리 상에서 데이터가 연속적으로 배치되어 CPU 캐시를 최대한 활용할 수 있습니다.
  • 분리된 로직
    • 엔티티는 데이터를 담는 역할만 하며, 실제 처리 로직은 시스템에서 수행됩니다. 이로 인해 각 시스템은 독립적으로 최적화 및 병렬 실행이 가능합니다.

병렬 처리 및 확장성

  • Job System과의 결합
    • Job System을 사용하면, 여러 엔티티에 대한 작업을 동시에 실행할 수 있습니다. 이는 특히 많은 수의 엔티티를 관리해야 하는 게임이나 시뮬레이션에서 성능을 극대화합니다.
  • Burst Compiler의 최적화
    • Burst Compiler를 통해 Job 내의 코드를 네이티브 코드로 변환함으로써, 계산 집약적인 작업에서 뛰어난 성능을 발휘할 수 있습니다.

메모리 관리

  • 예측 가능한 메모리 사용

    • DOTS는 컴포넌트 데이터를 연속적으로 저장하기 때문에, 메모리 할당과 해제가 예측 가능하며, 가비지 컬렉션의 부하를 크게 줄일 수 있습니다.
  • 데이터 지역성

    • 연속된 메모리 접근으로 인해, CPU 캐시 히트율이 증가하고, 데이터 접근 속도가 빨라집니다.

패키지 설치 관련

  • Entities (ECS 기능)

  • Burst (최적화 컴파일)

  • Mathematics (수학 함수 및 데이터 타입)

  • Job System (Unity엔진에 기본 포함되어 있어 설치 X)

  • Entities Graphics (ECS 기반의 렌더링이나 DOTS 렌더 파이프 라인을 사용하고자 하면 설치)

  • Netcode for Entities (멀티 플레이어 게임이나 네트워크 기능을 구현하려고 하는 경우 설치)


결론

  • DOTS는 데이터를 중심으로 설계하여 고성능과 확장성을 극대화하는 Unity의 기술 스택입니다.
  • ECS를 통해 객체들을 단순한 데이터와 시스템으로 분리하여 관리하며
  • Job System으로 병렬 처리를 효율적으로 수행하고
  • Burst Compiler로 코드를 네이티브 수준으로 최적화하여 실행 성능을 높입니다.
profile
Unity 게임 개발자를 준비하는 취업준비생입니다..

0개의 댓글