유니티 DOTS와 데이터 지향적 프로그래밍 구조
1. OOP와 DOD의 차이
게임 개발에서 전통적으로 사용된 프로그래밍 패러다임은 **객체 지향 프로그래밍(OOP, Object-Oriented Programming)**입니다. OOP는 코드 재사용성과 구조화를 중점으로 두고, 오브젝트 단위로 데이터를 캡슐화하여 클래스와 상속 구조를 만들어 나가는 방식입니다. 예를 들어 플레이어 캐릭터, 적 NPC, 아이템 각각을 클래스로 정의하고 행동 메서드를 포함하는 형태입니다.
그러나 이러한 방식은 대규모 씬이나 수천 개 이상의 오브젝트를 처리할 때 성능 한계에 직면합니다. 이유는 메모리 배치가 비연속적이며, CPU 캐시 적중률이 낮기 때문입니다. OOP에서는 각 오브젝트가 개별 메모리 블록에 분산되기 때문에 데이터 접근이 비효율적이고, CPU가 데이터를 읽는 동안 캐시 미스가 빈번하게 발생합니다.
이에 대응하는 것이 **데이터 지향 프로그래밍(DOD, Data-Oriented Design)**입니다. DOD는 데이터를 중심으로 코드를 설계하여, 연산에 필요한 데이터를 연속 메모리 블록에 배치함으로써 캐시 효율성을 극대화합니다. 즉, CPU가 한 번에 더 많은 데이터를 읽고 처리할 수 있어 성능 향상이 가능합니다.
2. Entity-Component-System(ECS) 구조 분석
유니티 DOTS(Data-Oriented Technology Stack)는 DOD 철학을 기반으로 한 ECS(Entity-Component-System) 아키텍처를 제공합니다. ECS는 전통적인 OOP와 달리 오브젝트 중심이 아닌 데이터 중심으로 게임 오브젝트를 설계합니다.
-
Entity: 게임 내 존재하는 모든 객체를 식별하는 ID. 예를 들어 플레이어, 적, 총알 등.
-
Component: 순수 데이터 구조체(Data Struct)로, 속성과 상태를 정의. 예: 위치(Position), 속도(Velocity), 체력(Health).
-
System: Component 데이터를 처리하는 로직. 예: 이동 처리 시스템(MovementSystem), 충돌 처리 시스템(CollisionSystem).
이 구조의 핵심 장점은 데이터 접근의 연속성입니다. 예를 들어 모든 적 NPC의 위치와 속도 데이터를 연속 배열에 저장하면, 이동 로직을 처리하는 시스템이 CPU 캐시에 연속적으로 접근하면서 대량 데이터를 효율적으로 처리할 수 있습니다.
3. Job System과 Burst Compiler
유니티 DOTS는 ECS만으로 끝나지 않고, Job System과 Burst Compiler를 통해 멀티스레드 최적화와 네이티브 수준의 성능 향상을 지원합니다.
-
Job System은 CPU 코어를 최대한 활용하여 병렬로 작업을 처리하도록 설계되었습니다. 예를 들어, 수천 개의 NPC 이동 처리, 총알 궤적 계산, 물리 연산 등을 각각의 스레드에서 동시에 실행할 수 있습니다.
-
Burst Compiler는 C# 코드를 LLVM 기반 네이티브 코드로 변환하여 SIMD 명령어를 활용합니다. 이를 통해 단일 CPU 코어에서도 벡터 연산 최적화와 캐시 친화적 실행이 가능해집니다.
이 두 기술을 결합하면, 전통적인 OOP 기반 Unity 프로젝트에서 수천 개 오브젝트를 처리할 때 발생하는 CPU 병목을 상당 부분 해소할 수 있습니다.
4. 실제 성능 개선 사례
실제 프로젝트에서 DOTS를 적용한 사례를 살펴보겠습니다.
-
수천 개 오브젝트 이동 처리
-
기존 OOP: 1000개의 적 NPC 이동 처리 시 CPU 사용률 85% 이상, 프레임 드랍 발생.
-
DOTS + Job System: 동일 조건에서 CPU 사용률 35%로 감소, 60fps 안정 유지.
-
-
물리 연산 최적화
-
ECS와 Burst Compiler를 활용하여 총알 충돌 및 폭발 계산을 병렬 처리.
-
기존 MonoBehaviour 방식 대비 최대 3배 이상 속도 향상.
-
-
대규모 씬 렌더링
-
DOTS Transform 시스템을 이용하여 수천 개의 움직이는 오브젝트 위치 갱신 최적화.
-
GPU는 기존과 동일하게 렌더링하지만 CPU에서 위치 계산 병목 해소로 전체 프레임 안정화.
-
이처럼 DOTS와 DOD는 대규모 게임 씬에서 OOP 한계를 극복하고, CPU 병목을 해소하는 데 핵심 역할을 합니다.
5. 결론
유니티 DOTS와 ECS 기반 데이터 지향 프로그래밍은 단순한 코딩 패러다임 변경이 아닙니다. 이는 게임 성능 최적화, CPU 병목 해소, 멀티코어 활용 극대화를 가능하게 하는 구조적 혁신입니다.
전통적인 OOP 기반 개발에서는 불연속 메모리와 드로우 콜 증가로 인해 대규모 씬에서 성능 저하가 발생하지만, DOTS는 데이터 중심 설계와 병렬 처리로 이를 해결합니다.
개발자는 DOTS 구조와 Job System, Burst Compiler를 이해하고, 실제 프로젝트에 적용하여 대규모 NPC, 파티클, 물리 연산 등 CPU 집약적인 작업에서 프레임을 안정화시킬 수 있습니다. 이는 AAA 게임 개발에서도 중요한 성능 최적화 전략이 될 뿐 아니라, 차세대 Unity 개발의 필수 역량으로 자리 잡고 있습니다.
댓글
댓글 쓰기