Unity

[Unity] DOTS 성능 최적화 단계별 비교

바다랑이 2025. 4. 13. 23:15

Unity 성능 최적화 단계별 비교: DOTS ECS, Job System, Burst Compile의 차이점은?

Unity로 게임을 개발하다 보면 성능 최적화에 대한 고민은 피할 수 없습니다. Unity의 최신 아키텍처인 DOTS(Data-Oriented Technology Stack)는 이런 고민을 해결해줄 수 있는 강력한 도구입니다. 하지만 실제 개발 상황에서는 DOTS를 전부 도입하는 것이 어렵거나 불필요한 경우도 있죠.

그래서 이번 글에서는 다음과 같은 4가지 시나리오를 기준으로 성능 구조를 비교해보겠습니다:

  1. DOTS ECS를 사용하지 않는 경우
  2. DOTS ECS를 Main Thread에서만 사용하는 경우
  3. Job System을 사용하지만 Burst Compile은 하지 않는 경우
  4. Burst Compile까지 사용하는 경우

✅ 1번과 2번의 차이는 무엇일까?

1번은 기존 Unity 스타일의 개발 방식입니다. MonoBehaviour 중심으로 모든 로직이 돌아가고, Unity의 GameObject/Component 시스템만을 사용합니다. Transform.position += ... 이런 식으로 객체를 직접 조작하죠.

2번 DOTS의 ECS(Entity Component System) 구조를 사용하지만, Job System이나 Burst 없이 메인 스레드에서만 실행하는 경우입니다. 즉, IComponentData, SystemBase, EntityQuery 등 ECS 기반 구조로 설계는 했지만, Job.Schedule() 또는 BurstCompile 없이 CPU 한 코어만을 사용합니다.

1번과 비교하여 2번은 struct 기반 데이터를 사용하므로, GC(Garbage Collecting)가 거의 발생하지 않고 런타임 성능이 보장됩니다.

💥 Job System을 사용하지만 Burst Compile은 하지 않는 경우

IJob, IJobParallelFor, IJobEntity 등을 사용해서 병렬 처리를 구현하지만, Burst Compiler를 적용하지는 않은 상태입니다.

  • CPU 코어 다중 사용 가능 (성능 향상)
  • 코드 구조가 더 복잡해짐
  • Burst를 사용하지 않아도 많은 오브젝트에서 성능 차이 체감 가능
public partial struct MoveJob : IJobEntity {
    public float deltaTime;

    public void Execute(ref LocalTransform transform, in MoveSpeed speed) {
        transform.Position += new float3(0, 0, speed.Value * deltaTime);
    }
}

 

⚡️Burst Compile까지 사용하는 경우

DOTS ECS + Job System + BurstCompile까지 결합한 최고의 성능 구조입니다. SIMD 명령어, LLVM 최적화 등을 통해 CPU 레벨에서 극한의 최적화가 이루어집니다.

  • 멀티코어 + SIMD 최적화 → 매우 빠른 처리 가능
  • 대량의 Entity를 실시간으로 처리할 수 있음
  • 단점: Burst Compile이 적용된 코드는 고성능 네이티브 코드(C++ 수준)로 컴파일됩니다. 이 과정에서 다음과 같은 일반적인 C# 기능은 사용할 수 없습니다:
    • GameManager.Instance 같은 싱글톤 접근
    • Camera.main, Input.GetKey() 같은 UnityEngine 클래스 접근
    • 예외 처리 (try-catch)
    • 할당 기반 컬렉션 (List<T>, Dictionary<T> 등)
    • 참조 타입 클래스 (class) 사용 제한
  • Burst Compile은 초고속 성능을 제공하지만, 그 대가로 GameManager.Instance와 같은 싱글톤 접근이 불가능합니다.
    따라서 전역 상태가 필요한 경우에는 미리 값을 꺼내 Job에 전달하거나, 싱글톤 접근을 Job 외부에서만 처리해야 합니다.
    이 제약은 Burst가 C#의 일부 기능을 버리고 Native 성능을 얻는 트레이드오프의 결과입니다.

💡 정리: 4단계 성능 비교

구분 DOTS ECS Job System Burst 사용 병렬 처리 최적화 수준
1번 낮음
2번 중간 이하
3번 중간 이상
4번 최고