프로그래밍 언어/Unity
[Unity] Unity DOTS (Data-Oriented Technology Stack)
해달이랑
2025. 4. 1. 23:20
개요
유니티 DOTS는 유니티 차세대 성능 최적화 프레임워크로, 기존의 객체지향 방식(Object-Oriented) 대신 데이터지향(Data-Oriented) 방식을 사용한다. 멀티스레딩과 캐시 최적화를 통해 게임 성능을 극대화 할 수 있다.
주요 구성 요소
구성 요소 | 설명 |
ECS(Entity Component System) | 객체 지향이 아닌 데이터 중심(Entity-Component)방식으로 게임 구조를 최적화 |
C# Job System | 멀티스레딩 지원으로 CPU 성능을 극대화 |
Burst Compiler | 저수준 네이티브 코드로 최적화하여 실행 속도를 향상 |
ECS (Entity Component System) 기본 개념
기존의 객체 지향 방식은 GameObject(MonoBehaviour)을 기반으로 한 클래스가 많을수록 성능이 저하된다.
public class Player : MonoBehaviour
{
public int health;
public float speed;
void update()
{
transform.position += Vector3.forward * speed * Time.deltaTime;
}
}
ECS 방식은 Entity + Component + System 구조로, 데이터와 로직을 분리해서 CPU 캐시 효율을 극대화하는 방식이다. GameObject 대신 데이터만 존재하고 순수 데이터를 통해 모든 Entity의 데이터를 처리하는 로직을 구현한다.
using Unity.Entities;
using Unity.Mathematics;
using Unity.Transforms;
using UnityEngine;
// 속도 데이터를 저장하는 컴포넌트
public struct MoveSpeed : IComponentData
{
public float Value;
}
// 모든 entity의 이동 로직 처리
public partial struct MoveSystem : ISystem
{
public void OnUpdate(ref SystemState state)
{
// 모든 엔티티의 대상으로 로직을 실행
foreach(var (transform, speed) in SystemAPI.Query<RefRW<LocalTransform>, RefRO<MoveSpeed>>())
{
transform.ValueRW.Position += new float3(0, 0, speed.ValueRO * SystemAPI.Time.DeltaTime);
}
}
}
Job System
Job System은 유니티 C# 스레드 풀을 활용하여 병렬로 작업을 수행할 수 있는 기능이다. 유니티의 기본 Update() 방식은 단일 스레드로 실행되기 때문에 많은 연산을 수행하면 CPU 병목 현상이 발생할 수 있다.
장점
- CPU 코어를 최대한 활용하여 병렬 연산이 가능
- Garbage Collection(GC) 부담이 적음
- Native Container를 사용하여 빠르고 안전한 데이터 접근 가능
public structt MyJob : IJob
{
public float a;
public float b;
public NativeArray<float> result;
public void Execute()
{
return[0] = a + b;
}
}
public class JobSystemExample : MonoBehaviour
{
private NativeArray<float> myArray;
void Start()
{
myArray = new NativeArray<float>(100000, Allocator.Persistent);
}
void Update()
{
var job = new MyJob();
job.a = 10;
job.b = 10;
job.result = myArray;
JobHandle handle = job.Schedule(); // Schedule(배열 크기, 배치 크기) 멀티 스레드 실행
handle.Complete(); // 작업 완료까지 대기
}
void OnDestroy()
{
myArray.Dispose(); // 메모리 해제
}
}
Burst Compiler
Burst Compiler는 C#코드를 네이티브 머신 코드로 변환하여 최적화 하는 기능이다. C++ 수준의 최적화가 가능하고 크로스 플랫폼을 지원한다. CPU SIMD(Vertorization)을 활용하여 연산 속도를 극대화 했다.
[BurstCompile]
struct HeavryComputationJob : IJob
{
public NativeArray<float> data;
public void Execute()
{
for(int i = 0; i < data.length; ++i)
{
data[i] = Mathf.Sin(data[i]) * Mathf.Cos(data[i]);
}
}
}