언리얼 엔진 메인 스레드의 기본 구조
언리얼의 런타임 스레드 구성은 복잡하지만, 게임의 논리적 “심장”은 항상 Game Thread다. 이 Game Thread는 전통적인 엔진 아키텍처에서 메인 스레드 역할을 수행한다.
1) Game Thread (Main Thread)
언리얼의 거의 모든 게임플레이 로직, 액터 생성/파괴, UObjects 상태 변경, 리플리케이션 로직, Input 처리가 여기서 이루어진다.
- UObject 시스템은 thread-safe 하지 않기 때문에
→ 대부분의 UObject 액세스는 Game Thread에서만 안전하다. - Tick(), Timer, AI, Gameplay Ability System(GAS) 로직 등이 여기서 동작.
- Slate UI도 Game Thread에서 처리하거나 전용 Slate Thread가 있을 수 있지만, 메인 게임 로직은 GT를 중심으로 흘러간다.
✔ 개발자에게 의미하는 점:
멀티스레드를 활용하더라도 “실제 게임월드 변경”은 결국 GT에서 이루어져야 한다.
Render Thread / RHI Thread
1) Render Thread
렌더링 커맨드 생성, Draw Call 구성, View/Scene 업데이트 등을 처리하는 스레드.
- Game Thread는 렌더링에 필요한 Scene 정보를 업데이트한 뒤
Render Thread로 렌더 명령을 Push하는 방식. - GT와 RT는 보통 한 프레임 정도 지연(Decoupling)되어 동작한다.
2) RHI Thread
렌더링 명령을 더 하드웨어 친화적인 수준으로 변환하고 GPU 드라이버로 넘기는 역할.
엔진 옵션에 따라 Render Thread와 RHI Thread가 합쳐져 동작할 수도 있다.
RHI는 Render Hardware Interface의 약자이다.
3. Task Graph System (경량 스레드 풀 기반 작업 시스템)
언리얼의 철학에서 매우 중요한 요소가 Task Graph다.
- 메인 스레드를 블로킹하지 않고 많은 작업을 “작은 태스크(Tasks)”로 분할하여
다수의 Worker Thread가 병렬로 수행한다. - 예: 물리 연산, 애니메이션 블렌딩, AI 경로 계산, 로딩 전처리 등.
✔ Task Graph는 “병렬 최적화”의 관문이지만
실제 UObject 접근은 여전히 대부분 Game Thread에서만 가능하므로
비 UObject 데이터 중심 작업을 병렬화하는 구조가 핵심이다.
4. Physics Thread (Chaos)
Chaos Physics는 자체 스레드를 사용해 물리 시뮬레이션을 수행한다.
- Game Thread가 Scene을 업데이트
- Physics Thread가 다음 물리 프레임 계산
- 결과를 Game Thread가 받아 게임 상태로 통합
언리얼의 멀티스레드 설계 철학이 잘 드러나는 부분.
5. Audio Thread
사운드는 전용 스레드에서 처리되며, Game Thread의 흐름과 분리된다.
6. 언리얼 엔진의 ‘설계 철학’
언리얼의 전체 구조를 지배하는 핵심 철학은 다음 두 가지다.
철학 1) Deterministic & Safe: 게임 세계의 일관성을 메인 스레드에서 유지한다
언리얼은 게임 월드의 “authority”를 Game Thread에 둔다.
왜냐하면:
- UObject는 매우 복잡한 상호 의존성을 갖는다
- 멀티스레드 환경에서 객체 변경이 일어나면 디버깅 난이도가 폭증
- 네트워크/리플리케이션은 일관된 세계 상태를 요구한다
- 렌더링, 물리, AI 등 다양한 서브시스템이 GT 상태를 기준으로 동작한다
그래서 Game Thread는 일관성의 중심(Core of truth) 역할을 맡는다.
철학 2) Parallelize everything else: 병렬화 가능한 것은 모두 분리한다
메인 스레드가 병목이 되지 않도록 다음을 모두 분리:
- 렌더링
- 물리
- 애니메이션 작업
- AI 계산
- 태스크 기반의 병렬 처리
- 사운드
즉:
“게임 월드의 정합성은 메인 스레드에서,
계산 비용 큰 작업은 가능하면 모두 병렬로.”
이것이 언리얼의 멀티스레드 최소 원칙이라고 볼 수 있다.
7. 프레임 단계 흐름(고수준 요약)
프레임마다 엔진은 대략 다음 순서로 진행된다:
- Input 수집
- Game Thread Tick
- Actor Tick
- Components Tick
- Gameplay Logic
- AI, Animation Blueprint 업데이트 등
- Physics Simulation (비동기)
- Game Thread와 Physics 결과 통합
- Scene 업데이트 → Render Thread로 전달
- Render Thread에서 Draw Command 생성
- RHI Thread → GPU 제출
- 프레임 종료
이 흐름은 "Game Thread가 모든 시스템의 기준점"이라는 구조를 가장 잘 보여준다.
전체적으로 보면 언리얼 엔진은 안정성과 디버깅 용이성을 위해 세계의 ‘진실’을 하나의 스레드(Game Thread)에 두고,
나머지 무거운 작업은 가능한 한 병렬화하는 형태로 아키텍처를 구성하고 있다.
'게임 개발 > Unreal Engine 기본' 카테고리의 다른 글
| [UE5] stat unit (2) | 2023.03.24 |
|---|---|
| [UE] Unreal Egnine 쿠킹 By the Book, On the Fly (0) | 2023.03.20 |
| [UE] UGameInstanceSubsystem, ULocalPlayerSubsystem... (0) | 2022.12.19 |
| [UE4] Unreal Engine 게임 플로우 (0) | 2022.04.22 |
| [UE4] UClass, UFunction, UProperty, UEnum UInterface 메타데이터 지정자 (0) | 2022.02.16 |