
Unity 성능 최적화 단계별 비교: DOTS ECS, Job System, Burst Compile의 차이점은?
Unity로 게임을 개발하다 보면 성능 최적화에 대한 고민은 피할 수 없습니다. Unity의 최신 아키텍처인 DOTS(Data-Oriented Technology Stack)는 이런 고민을 해결해줄 수 있는 강력한 도구입니다. 하지만 실제 개발 상황에서는 DOTS를 전부 도입하는 것이 어렵거나 불필요한 경우도 있죠.
그래서 이번 글에서는 다음과 같은 4가지 시나리오를 기준으로 성능 구조를 비교해보겠습니다:
- DOTS ECS를 사용하지 않는 경우
- DOTS ECS를 Main Thread에서만 사용하는 경우
- Job System을 사용하지만 Burst Compile은 하지 않는 경우
- 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번 | ✅ | ✅ | ✅ | ✅ | 최고 |
'Unity' 카테고리의 다른 글
| [Unity] DOTS 개념 정리: Struct 구조 변경, ECB 사용법 등 (0) | 2025.04.23 |
|---|---|
| [Unity] DOTS 실전 개념 정리 - Tag, EnableableComponent, CompanionLink 이해하기 (0) | 2025.04.23 |
| [Unity] DOTS 이해하기 (0) | 2025.04.08 |
| [Unity] NetCode 공부일지 (0) | 2025.04.05 |
| [Unity] UniTask가 뭘까? (0) | 2025.03.20 |