젠 로더(Zen Loader) 는 언리얼 엔진 5(UE5) 의 새로운 런타임 로더입니다. 젠 로더는 스테이징 페이즈에 오프라인으로 계산되는 오브젝트 종속성 그래프와 최적화된 패키지를 사용하여 CPU 오버헤드를 줄입니다. 젠 로더는 모든 에셋을 하나 이상의 .pak 파일로 패키징하는 방식이 아닙니다. 그 대신 패키지 데이터, 벌크 데이터, 셰이더 데이터를 모두 .utoc
와 .ucas
컨테이너 파일 세트로 패키징합니다.
.pak
파일은 액세스 빈도가 낮고 압축되지 않은 개별 파일에 사용됩니다. Pak 파일이 마운트되면 해당 컨테이너 파일도 마운트됩니다. .utoc
파일은 청크 크기 및 오프셋, 압축 포맷, 청크 암호화 여부를 포함합니다. .uca
파일에는 실제 데이터가 들어 있습니다. 컨테이너 파일을 사용하면 파일 시스템의 추상화를 방지하고, I/O 디스패처라는 새로운 I/O 추상화 레이어로 로더에 CPU 오버헤드를 최소화하면서 데이터 청크를 찾을 수 있는 기능을 제공합니다. 플랫폼별 백엔드를 사용하여 하드웨어 기능과 API를 활용합니다.
젠 로더 사용하기
컨테이너 파일은 언리얼 자동화 툴(Unreal Automation Tool, UAT) 로 스테이징하는 동안 기본적으로 생성되며, 이러한 컨테이너 파일이 있으면 런타임 시 젠 로더가 활성화됩니다.
프로젝트에서 명령을 실행하는 방법에 대한 자세한 내용은 언리얼 자동화 개요 문서를 참조하세요.
이벤트 주도형 로더(Event Driven Loader, EDL) 런타임 로더는 더 이상 사용되지 않으며 향후 출시에서 제거될 예정이지만, 다음 명령을 입력하면 스테이징 중에 UAT와 함께 계속 사용할 수 있습니다.
-SkipIoStore
또는 C:\MyProject\Config\DefaultGame.ini
파일로 이동한 다음 [ProjectPackagingSettings] 섹션에 다음 줄을 추가하여 사용할 수도 있습니다.
[/Script/UnrealEd.ProjectPackagingSettings]
bUseIoStore=False
bUseIoStore
부울 값을 False
로 설정하면 젠 로더가 IOStore를 사용하지 않도록 할 수 있습니다.
제한 사항
I/O 디스패처(I/O Dispatcher) 는 청크 ID로 주소가 지정된 데이터를 로드하는 새로운 I/O 추상화 레이어입니다. 즉, I/O API 기반의 표준 파일/디렉터리 포맷을 사용하여 데이터를 로드하거나 검색할 수 없습니다. 에셋 레지스트리는 디렉터리에서 에셋을 검색할 수 있는 기능을 지원합니다. 젠 로더를 사용한다면 초기 직렬화가 완료된 후에는 벌크 데이터가 인라인 데이터를 더 이상 로드할 수 없습니다. 즉, 언로드된 데이터를 다시 얻을 수 없습니다. 자주 액세스해야 하는 데이터 세트는 쿠킹 페이즈에 인라인이 아닌 데이터로 저장해야 합니다. 젠 로더는 스테이지 시간에 오브젝트 종속성을 오프라인에서 프리프로세스하는 과정을 거칩니다. 이렇게 하면 런타임에 필요한 패키지 리디렉션이 방지되고, 로드하는 동안 코어 리디렉션과 델리게이트 리졸버 등의 시스템이 무시됩니다.
컨테이너 파일의 콘텐츠 검사
아래 표에서 컨테이너 파일과 호환되는 UnrealPak이 지원하는 명령을 볼 수 있습니다.
명령 | 설명 | |
---|---|---|
-list | 컨테이너의 청크를 나열합니다. | |
-diff | 컨테이너의 콘텐츠를 비교합니다. | |
-extract | 컨테이너의 콘텐츠를 추출합니다. | |
IoStore -describe | 컨테이너의 종속성, 패키지, 임포트, 익스포트에 대한 디테일한 정보를 보여 줍니다. describe 명령은
|
문제 해결
다음은 스테이지별로 오류나 경고를 파악하는 데 도움이 되는 유용한 문제 해결 명령입니다.
로딩
로딩 스테이지에 젠 로더는 LogStreaming 로그 채널을 사용하고 명령줄에서 다음 명령을 사용하여 Verbose/VeryVerbose 로깅을 일시적으로 활성화할 수 있습니다.
-LogCmds="LogStreaming veryverbose"
대규모 프로젝트에서는 로깅 시간이 오래 걸릴 수 있습니다. 다음 명령으로 선택한 패키지 이름이나 패키지 ID를 설정하여 특정 패키지의 로그에 필터를 적용할 수 있습니다.
-s.VerbosePackageNames="/Game/PackageA/Game/PackageB0xABCD1234ABCD1234"
디버거를 어태치한 상태로 실행 중이라면 다음 명령을 사용할 수 있습니다.
-s.DebugPackageNames
이 명령은 지정된 패키지의 특정 로드 페이즈에 자동 중단점을 제공합니다.
스테이징
스테이징 페이즈에 UAT 는 다음 명령을 사용하여 각 컨테이너에 저장된 모든 패키지를 지정하는 응답 파일 명령 리스트를 하나 이상 생성합니다.
-ScriptsForProject= "C:\MyProject\MyProject.uproject"
디렉터리 경로에 있는 UAT 로그 파일에서 이 명령과 기타 명령을 찾을 수 있습니다.
c:Engine\Programs\AutomationTool\Saved\Logs\Log.txt
젠 로더 내부
젠 로더는 이벤트 주도형 로더(EDL) 기반이며, 이름 테이블, 임포트/익스포트 맵, 프리로드 종속성 등의 쿠커 출력 타입이 동일해야 합니다. 레거시 EDL 런타임 로직은 오프라인으로 이동되었고, 스테이징 페이즈에 생성됩니다.
오프라인 프리프로세스로 최적화됨에 따라 런타임 패키지 종속성 트래킹을 처리하는 데 걸리는 시간이 초 단위에서 밀리초 단위로 단축됩니다.
또한 다음과 같은 추가 변경 사항이 있습니다.
-
패키지 요약, 익스포트 블롭, 벌크 데이터, 셰이더는 컨테이너 파일에 저장됩니다.
-
가장 중요한 패키지 메타데이터와 모든 패키지 상호 종속성은 패키지 ID로 인덱싱된 패키지 스토어에 수집됩니다.
-
.uasset 패키지 헤더는 최적화된 패키지 요약으로 변환됩니다.
-
외부 체인이 있는 임포트 맵이 제거되고 익스포트 오브젝트 해시에 의한 직접 참조로 대체되었습니다.
-
이름 테이블에는 최적화된 새로운 배치 포맷이 있습니다.
-
프리로드 종속성이 패키지별 익스포트 번들 노드로 합쳐졌으며, 각각은
CreateExport
및SerializeExport
호출의 시퀀스와 기타 익스포트 번들 노드에 대한 종속성을 지정합니다.
-
젠 스토어
젠 스토어(Zen Store)는 압축되지 않은 파일을 로컬 파일 시스템에 저장하지 않고 쿠킹된 에셋을 로컬 스토리지 서버에 저장할 수 있는 실험 단계 기능입니다. 자세한 내용은 젠 스토어 페이지를 참고하세요.