Unity/팁

[Unity] Unity로 멀티 스레드 사용하기

turbulence93 2025. 8. 4. 22:51

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을 통해 작업을 일시정지하고 다른 작업을 실행할 수 있는 것임으로 이점 유의해서 사용하도록 하자.