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
public void Execute(int index)
{
data[index] *= 2;
}
}
'''
3. 멀티스레딩 시 주의사항
- UnityEngine API 호출 금지 (메인 스레드 전용)
- 데이터 동기화(락,
ConcurrentQueue등) 필요 - 너무 많은 스레드는 오히려 성능 저하
- 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 |
