게임 개발/Unreal Engine 기본

언리얼 엔진의 메인 스레드 구조 및 설계 철학

지노윈 2025. 12. 9. 15:48
반응형

언리얼 엔진 메인 스레드의 기본 구조

언리얼의 런타임 스레드 구성은 복잡하지만, 게임의 논리적 “심장”은 항상 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에 둔다.

왜냐하면:

  1. UObject는 매우 복잡한 상호 의존성을 갖는다
  2. 멀티스레드 환경에서 객체 변경이 일어나면 디버깅 난이도가 폭증
  3. 네트워크/리플리케이션은 일관된 세계 상태를 요구한다
  4. 렌더링, 물리, AI 등 다양한 서브시스템이 GT 상태를 기준으로 동작한다

그래서 Game Thread는 일관성의 중심(Core of truth) 역할을 맡는다.


철학 2) Parallelize everything else: 병렬화 가능한 것은 모두 분리한다

메인 스레드가 병목이 되지 않도록 다음을 모두 분리:

  • 렌더링
  • 물리
  • 애니메이션 작업
  • AI 계산
  • 태스크 기반의 병렬 처리
  • 사운드

즉:

“게임 월드의 정합성은 메인 스레드에서,
계산 비용 큰 작업은 가능하면 모두 병렬로.”

이것이 언리얼의 멀티스레드 최소 원칙이라고 볼 수 있다.


7. 프레임 단계 흐름(고수준 요약)

프레임마다 엔진은 대략 다음 순서로 진행된다:

  1. Input 수집
  2. Game Thread Tick
    • Actor Tick
    • Components Tick
    • Gameplay Logic
    • AI, Animation Blueprint 업데이트 등
  3. Physics Simulation (비동기)
  4. Game Thread와 Physics 결과 통합
  5. Scene 업데이트 → Render Thread로 전달
  6. Render Thread에서 Draw Command 생성
  7. RHI Thread → GPU 제출
  8. 프레임 종료

이 흐름은 "Game Thread가 모든 시스템의 기준점"이라는 구조를 가장 잘 보여준다.


전체적으로 보면 언리얼 엔진은 안정성과 디버깅 용이성을 위해 세계의 ‘진실’을 하나의 스레드(Game Thread)에 두고,
나머지 무거운 작업은 가능한 한 병렬화하는 형태로 아키텍처를 구성하고 있다.

반응형