본문 바로가기

언리얼 엔진 5

언리얼 엔진 5 DLC 시스템 구현을 위한 패키징 시스템 분석 (Pak / Io Store)

언리얼 엔진에서 DLC 시스템을 구현하고자 한다면, 일반적으로는 원하는 리소스를 Pak 파일로 분리하고, 필요 시 Pak 파일을 로드하여 사용하는 방법이 있을 것이다.

 

하지만, Pak 파일은 기본적으로 여러 리소스를 하나의 파일로 묶어버리는 만큼 Pak 데이터에 접근할 때 불편함이 있으며, Pak 파일 안의 리소스 중 일부만이 필요하다고 할 때 불필요한 로드가 발생할 여지가 있다.

 

언리얼 엔진 5에 추가된 런타임 로더인 젠 로더는 Pak 시스템과 더불어 Io Store 시스템을 사용하며 후술할 Io Store 시스템의 장점을 적절히 잘 이용한다면 위에 서술한 문제가 해결될 것으로 보인다.

 

Io Store 시스템은 다음과 같은 특징을 가진다.

  1. 기존의 .pak 파일에 더하여 실제 데이터를 담당하는 .ucas 파일과 데이터의 색인 역할을 하는 .utoc 파일로 분리되어 관리된다. 
  2. 각 데이터는 .ucas 파일 안에 청크 단위로 보관되며, 데이터 접근 시 .ucas 파일과 .utoc 파일을 같이 읽어 데이터를 활용할 수 있도록 한다.

 

데이터가 청크 단위로 보관된다는 특징에서 오는 장점은 다음과 같다.

  1. 필요한 데이터에 접근할 시의 오버헤드가 최소화된다.
  2. 청크 ID를 통해 필요한 데이터만 로드할 수 있다. (오픈월드처럼 최적화가 필요한 환경일 경우 중요할 것으로 보인다.)

 

아래 내용은 다소 가정이 섞여있는 내용이므로, 참고만 하면 좋을 것 같다.

더보기

Io Store 시스템을 이용해 배포된 DLC가 수정되어 재배포해야 한다는 시나리오를 가정했을 때,

기존의 Pak 시스템만을 이용할때는 전체 DLC의 .pak 파일을 다시 배포해야 한다.

 

하지만, Io Store 시스템을 이용하고 .ucas / .utoc 부분에 수정이 발생할 경우에는,

엔진에서 제공하는 FIoStoreWriter를 이용해 기존의 .ucas의 청크를 추가 / 수정 시키는 방식으로 배포 용량을 최소화 시킬 수 있지 않을까 하는 생각이 있다.

 

 

물론 이렇게 좋아보이는 Io Store 시스템도 단점이 있을 것이다.

  1. 언리얼 엔진 5 프로젝트에서만 사용 가능하므로, 이전 버전에서 컨버트된 프로젝트라면 적용하기 어려울 수 있다.
  2. 최신 기술이라 그런지 정보가 심각하게 없다... (이 글에 적혀있는 내용도 버전이 바뀜에 따라 언제 바뀔지 모르고, 얼마나 부정확할 지 모른다.)
  3. 장점을 거창하게 적어놨지만 프로젝트 규모가 작을 경우 그냥 편리한 Pak 시스템만을 사용하는게 좋을 것이다.

 

Io Store 시스템을 사용하는 방법은 다음과 같다.

 

 

우선, 프로젝트 세팅에 Project - Packaging의 Use Io Store가 체크되어 있는지 확인한다.

 

그리고 프로젝트를 패키징하면서 원하는 에셋 청킹 과정을 거치면 되는데, 일단 나는 아래 문서의 방법을 이용했다.

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/preparing-assets-for-chunking-in-unreal-engine

 

 

 

에셋 청킹 과정을 거치고 나면 위의 사진과 같이 global 파일과 .pak 파일, .ucas 파일, utoc 파일이 보이는데

실제로 청킹된 에셋의 데이터는 .pak 파일이 아닌 .ucas에 들어있는 모습을 확인할 수 있다.

 

 

 

 

 

 

참고 문서

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/zen-loader-in-unreal-engine