PART 5 · 강의 1/4

Task Graph 활용

UE5의 병렬 작업 시스템으로 멀티코어를 활용합니다

01

Task Graph System 개요

동시 작업 관리 프레임워크

Task Graph System은 UE5의 동시 작업 관리 및 실행을 위한 강력한 프레임워크입니다.

🔄 Task Graph 핵심 구성 요소

📦 Tasks

동시에 실행 가능한 작업 단위

🚦 Events

작업 완료를 신호하는 메커니즘

🔗 Dependencies

실행 순서를 정의하는 작업 간 관계

핵심 구성 요소

구성 요소 설명
Tasks 동시에 실행 가능한 작업 단위
Events 작업 완료를 신호하는 메커니즘
Dependencies 실행 순서를 정의하는 작업 간 관계
02

AsyncTask 활용

백그라운드 작업 실행

⚡ AsyncTask 실행 흐름
1
Game Thread
AsyncTask 호출
2
Background
무거운 계산 처리
3
Game Thread
결과 적용
⭐ 백그라운드 스레드로 오프로드
코드 숨기기
// 무거운 계산을 백그라운드 스레드로 AsyncTask(ENamedThreads::AnyBackgroundThreadNormalTask, [this]() { // 무거운 계산 (Game Thread 외부) TArray<FVector> Results = CalculateHeavyData(); // 결과를 Game Thread로 전달 AsyncTask(ENamedThreads::GameThread, [this, Results]() { // Game Thread에서 결과 적용 ApplyResults(Results); }); });
스레드 안전성

백그라운드 스레드에서 UObject에 직접 접근하지 마세요. 계산 결과는 Game Thread로 전달 후 적용해야 합니다.

03

FAutoDeleteAsyncTask

자동 정리 비동기 태스크

FAutoDeleteAsyncTask는 작업 완료 후 자동으로 메모리가 정리되는 커스텀 비동기 태스크입니다.

커스텀 AsyncTask 클래스
코드 보기
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();
04

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"));
SUMMARY

핵심 요약

  • Task Graph: UE5의 병렬 작업 관리 프레임워크
  • AsyncTask: 간단한 람다 기반 백그라운드 작업
  • FAutoDeleteAsyncTask: 자동 정리되는 커스텀 태스크
  • FRunnable: 지속적인 워커 스레드 생성
  • 주의: 백그라운드에서 UObject 직접 접근 금지
다음 단계

다음 강의에서는 ParallelFor를 활용한 데이터 병렬 처리를 다룹니다.

PRACTICE

도전 과제

배운 내용을 직접 실습해보세요

실습 1: FAutoDeleteAsyncTask 사용

FNonAbandonableTask를 상속한 커스텀 태스크를 만들고, (new FAutoDeleteAsyncTask(Params))->StartBackgroundTask()로 실행하세요. 메인 스레드 대비 실행 시간 차이를 측정합니다.

실습 2: Task Graph 종속성 구성

FGraphEvent를 사용하여 3개의 태스크를 의존 관계(A->B, A->C, B+C->D)로 연결하세요. FTaskGraphInterface::Get().WaitUntilTaskCompletes()로 완료를 대기하고 실행 순서를 로그로 확인합니다.

심화 과제

UE5의 새로운 Tasks 시스템(UE::Tasks::Launch)을 사용하여 병렬 경로 탐색을 구현하세요. 100개 AI 에이전트의 경로를 병렬로 계산하고, 기존 순차 처리 대비 성능 향상을 Unreal Insights로 프로파일링합니다.