Task Graph 활용
UE5의 병렬 작업 시스템으로 멀티코어를 활용합니다
Task Graph System 개요
동시 작업 관리 프레임워크
Task Graph System은 UE5의 동시 작업 관리 및 실행을 위한 강력한 프레임워크입니다.
📦 Tasks
동시에 실행 가능한 작업 단위
🚦 Events
작업 완료를 신호하는 메커니즘
🔗 Dependencies
실행 순서를 정의하는 작업 간 관계
핵심 구성 요소
| 구성 요소 | 설명 |
|---|---|
| Tasks | 동시에 실행 가능한 작업 단위 |
| Events | 작업 완료를 신호하는 메커니즘 |
| Dependencies | 실행 순서를 정의하는 작업 간 관계 |
AsyncTask 활용
백그라운드 작업 실행
// 무거운 계산을 백그라운드 스레드로
AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this]()
{
// 무거운 계산 (Game Thread 외부)
TArray<FVector> Results = CalculateHeavyData();
// 결과를 Game Thread로 전달
AsyncTask(ENamedThreads::GameThread, [this, Results]()
{
// Game Thread에서 결과 적용
ApplyResults(Results);
});
});
백그라운드 스레드에서 UObject에 직접 접근하지 마세요. 계산 결과는 Game Thread로 전달 후 적용해야 합니다.
FAutoDeleteAsyncTask
자동 정리 비동기 태스크
FAutoDeleteAsyncTask는 작업 완료 후 자동으로 메모리가 정리되는 커스텀 비동기 태스크입니다.
class FMyAsyncTask : public FNonAbandonableTask
{
friend class FAutoDeleteAsyncTask<FMyAsyncTask>;
// 태스크 데이터
TArray<int32> DataToProcess;
public:
FMyAsyncTask(const TArray<int32>& InData)
: DataToProcess(InData) {}
void DoWork()
{
// 백그라운드에서 실행될 작업
for (int32& Value : DataToProcess)
{
Value *= 2; // 무거운 연산
}
}
FORCEINLINE TStatId GetStatId() const
{
RETURN_QUICK_DECLARE_CYCLE_STAT(
FMyAsyncTask,
STATGROUP_ThreadPoolAsyncTasks
);
}
};
// 실행
(new FAutoDeleteAsyncTask<FMyAsyncTask>(MyData))->StartBackgroundTask();
FRunnable 스레드
지속적인 백그라운드 작업
FRunnable은 지속적으로 실행되는 전용 워커 스레드를 생성할 때 사용합니다. 큐 처리, 네트워크 폴링 등에 적합합니다.
class FMyWorker : public FRunnable
{
bool bShouldStop = false;
public:
virtual uint32 Run() override
{
while (!bShouldStop)
{
// 지속적인 백그라운드 작업
ProcessQueue();
FPlatformProcess::Sleep(0.01f);
}
return 0;
}
virtual void Stop() override
{
bShouldStop = true;
}
};
// 스레드 생성
FMyWorker* Worker = new FMyWorker();
FRunnableThread::Create(Worker, TEXT("MyWorkerThread"));
핵심 요약
- Task Graph: UE5의 병렬 작업 관리 프레임워크
- AsyncTask: 간단한 람다 기반 백그라운드 작업
- FAutoDeleteAsyncTask: 자동 정리되는 커스텀 태스크
- FRunnable: 지속적인 워커 스레드 생성
- 주의: 백그라운드에서 UObject 직접 접근 금지
다음 강의에서는 ParallelFor를 활용한 데이터 병렬 처리를 다룹니다.
도전 과제
배운 내용을 직접 실습해보세요
FNonAbandonableTask를 상속한 커스텀 태스크를 만들고, (new FAutoDeleteAsyncTask
FGraphEvent를 사용하여 3개의 태스크를 의존 관계(A->B, A->C, B+C->D)로 연결하세요. FTaskGraphInterface::Get().WaitUntilTaskCompletes()로 완료를 대기하고 실행 순서를 로그로 확인합니다.
UE5의 새로운 Tasks 시스템(UE::Tasks::Launch)을 사용하여 병렬 경로 탐색을 구현하세요. 100개 AI 에이전트의 경로를 병렬로 계산하고, 기존 순차 처리 대비 성능 향상을 Unreal Insights로 프로파일링합니다.