[언리얼 페스트 서울 2025] Day1 언리얼 엔진의 멀티 플랫폼 엔진 아키텍처
- 언리얼 엔진은 다양한 플랫폼을 지원하며, 사용자는 비교적 간단한 프로세스로 플랫폼별 산출물을 생성할 수 있습니다. 🚀
- 멀티플랫폼 지원의 핵심은 플랫폼 종속적 분기 처리와 공통/종속 부분을 나누는 추상화 레이어입니다. 🏗️
Config 파일(예: .ini)은 런타임 분기 처리와 다양한 옵션을 관리하며, 엔진 커스터마이징에 깊이 관여합니다. ⚙️
- 언리얼 빌드 툴(UBT)은 모든 플랫폼의 통합 빌드를 담당하며, 모듈 종속성 체크와 플랫폼별 유연한 빌드를 제공합니다. 🛠️
- UBT는 컴파일러 환경 변수, 시스템 라이브러리 설정, 빌드 옵션 커스터마이징을 지원하며, Sanitizer 및 정적 코드 분석 기능을 포함합니다. 🔍
- OS/SDK 버전 관리는
iOS_SDK.json 등을 통해 이루어지며, 새로운 OS 버전 대응 시 컴파일러 및 정책 변화에 유의해야 합니다. 📱
- 엔진 부팅은 플랫폼별 엔트리 포인트(
Launch<PlatformName>.cpp)에서 시작되며, 안드로이드와 같은 모바일 OS는 자바 래핑과 별도의 이벤트 스레드를 통해 OS와 상호작용합니다. 🚦
- 대부분의 플랫폼은 메인 스레드와 게임 스레드를 분리하여 OS 이벤트 처리가 게임 스레드에 부하를 주지 않도록 합니다. ↔️
- 엔진은 OS의 라이프사이클 이벤트(예:
onResume, onPause)에 따라 렌더링 중지, 리소스 관리 등 적절히 동작합니다. 🔄
- 인풋 시스템은
FApplication 클래스를 통해 관리되며, PlatformApplication과 SlateApplication의 추상화 레이어를 거쳐 플레이어 컨트롤러로 전달됩니다. 🎮
- 플랫폼별 메모리 관리(
PlatformMemory)는 가용 메모리 획득, 메모리 풀 정책 정의, 다양한 메모리 할당자 선택을 지원합니다. 🧠
- 새로운 디바이스 포팅 시 GL/Vulkan 익스텐션 체크를 통해 드라이버 지원 여부를 확인하고 대응합니다. ✅
- 스레드 어피니티는 각 스레드가 어떤 CPU 코어에서 실행될지 마스킹하여 빅.리틀 아키텍처 등에서 성능 및 발열 관리에 기여합니다. 🎯
- 쉐이더 컴파일은 머티리얼 그래프를 USF/USH(HLSL 문법)로 변환하고,
HLSLMaterialTranslator를 통해 코드 청크를 생성합니다. 🎨
- 쉐이더 내 전처리기 사용은 성능을 위해 가독성을 희생하며, 과도한 사용은 쉐이더 컴파일 시간을 증가시키므로 퍼뮤테이션 감소 설정이 중요합니다. ⏱️
- HLSL은 DXC 컴파일러를 통해 DXIL/SPIR-V로 변환되고, SPIRV-Cross를 통해 메탈/GLSL로 다시 변환되는 과정을 거쳐 바이너리 쉐이더가 됩니다. 💻
- 언리얼 엔진은
ShaderConductor라는 서드파티 라이브러리를 래핑하여 쉐이더 컴파일을 처리하며, 이는 엔진 빌드와 별도로 관리됩니다. 🔗