728x90
반응형

📕오늘의 공부 주제



Unity에서 멀티스레딩을 구현하는 방법

🤔Why?



유니티는 대부분의 **UnityEngine API가 메인 스레드 전용**이라 멀티스레딩을 구현할 때 제약이 많습니다. 하지만 AI 연산, 경로 탐색, 대규모 데이터 처리, 압축/암복호화, 네트워크 패킷 가공 등과 같이 메인 스레드와 직접 상호작용하지 않는 작업은 **멀티스레딩**으로 처리하면 프레임 드랍을 크게 줄일 수 있습니다.

📖오늘의 공부 내용



1. C# 표준 스레딩 방식

(1) System.Threading.Thread

  • 가장 기본적인 스레드 생성 방법.
  • 장점: 단순하고 직관적.
  • 단점: 스레드 관리와 동기화를 직접 해야 함.

'''csharp
new Thread(() =>
{
// 메인 스레드와 무관한 작업
HeavyCalculation();
}).Start();
'''


(2) Task / async-await

  • 비동기 프로그래밍을 지원하는 방식.
  • 병렬 작업을 간단하게 작성 가능.
  • 예외 처리, 완료 시점 제어 용이.

'''csharp
async void Start()
{
await Task.Run(() => HeavyCalculation());
Debug.Log("계산 완료");
}
'''


2. Unity 전용 멀티스레딩

(1) Unity Job System

  • Unity가 제공하는 멀티스레드 프레임워크.
  • 데이터 중심 설계(DOTS) 기반.
  • 안전한 멀티스레드 환경 보장.
  • Burst Compiler와 함께 사용 시 네이티브 수준 성능 가능.

'''csharp
public struct MyJob : IJob
{
public void Execute()
{
// 병렬로 실행할 로직
}
}

// 사용
MyJob job = new MyJob();
JobHandle handle = job.Schedule();
handle.Complete();
'''


(2) IJobParallelFor

  • 대량의 데이터를 여러 스레드에서 병렬로 처리할 때 사용.

'''csharp
public struct MyParallelJob : IJobParallelFor
{
public NativeArray data;
public void Execute(int index)
{
data[index] *= 2;
}
}
'''


3. 멀티스레딩 시 주의사항

  1. UnityEngine API 호출 금지 (메인 스레드 전용)
  2. 데이터 동기화(락, ConcurrentQueue 등) 필요
  3. 너무 많은 스레드는 오히려 성능 저하
  4. Job System은 NativeArray, NativeList 등 네이티브 컨테이너 사용

4. 결론

  • 간단한 비동기 처리 → Task
  • 고성능 데이터 병렬 처리 → Unity Job System + Burst
  • 전통적인 방식이 필요할 때 → Thread
  • 항상 Unity API 호출은 메인 스레드에서만 실행해야 함
728x90
반응형

'프로그래밍 공부 > TIL' 카테고리의 다른 글

2025-08-11 TIL  (0) 2025.08.11
2025-08-08 TIL  (0) 2025.08.08
2025-08-06 TIL  (0) 2025.08.06
20250805 - TIL  (0) 2025.08.05
2025-08-04 TIL  (0) 2025.08.04