프로그래밍 언어/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]);
        }
    }
}