1. async/await (C# 비동기 처리)
목적
- 비동기 대기 (파일 IO, 네트워크 등)
- 메인 스레드를 블로킹하지 않고 기다림
특징
- C# 문법 기반
- await로 다음 코드 실행을 일시 중지
- Unity API는 호출 불가 (메인 스레드만 가능)
public async void LoadDataAsync() { await Task.Delay(1000); // 1초 대기 Debug.Log("Load Done"); }
2. Unity Job System (멀티스레딩 연산 최적화)
목적
- 대량의 계산 처리 (예: 수천 개의 물리 계산, 거리 계산 등)
- Burst 컴파일러로 성능 극대화
특징
- Unity가 스레드 풀 관리 (수동 생성 X)
- IJob, IJobParallelFor 인터페이스 사용
- NativeArray 등 Native 메모리만 사용 가능
- Unity API 접근 불가
3. Thread, Task (수동 스레딩)
목적
- 직접 쓰레드를 생성해서 병렬 처리 제어
- UI, 파일 처리 등과 분리된 독립 작업 처리
특징
- 시스템에서 직접 스레드 생성
- new Thread(...), Task.Run(...) 등
- Unity API 접근 시 충돌 발생 가능 (불가)
- 관리 직접 해야 하므로 어려움
4. 간단 정리 요약
| 분류 |
기술 |
목적 |
특징 |
| 비동기 처리 |
async/await |
IO나 UnityWebRequest 등 느린 작업 대기 |
간편하지만 Unity API 접근은 메인 스레드만 가능 |
| 병렬 연산 |
Job System |
대량의 연산, 반복 작업 최적화 |
Unity가 스레드 관리. 메모리 접근 제한 강함 (Native) |
| 수동 스레드 |
Thread, Task |
완전 수동 제어 필요 시 |
유연하지만 스레드 충돌, 상태 관리 어려움 |
5. 기타
유티니 자체는 단일 스레드이기 때문에 다양한 기술의 도움을 받아 멀티 스레드를 구현해야한다.
위 기술과 별개로 유니티에서 코루틴을 사용하여 멀티 스레드처럼 보이게 구현할 수도 있다.
다만 코루틴은 진짜 멀티 스레드가 아닌, yield return을 통해 작업을 일시정지하고 다른 작업을 실행할 수 있는 것임으로 이점 유의해서 사용하도록 하자.