공부/Unreal Engine 4

UE4 Patch System

Lero God 2020. 7. 26. 20:31
빌드, 쿠킹, 패키징

 

- 빌드란?
선택한 플랫폼에서 실행 가능한 실행 파일을 만드는 것이다.    

 

 - 쿠킹이란?
선택한 플랫폼에서 사용할 수 있는 포맷으로 컨텐츠들을 변환하는 과정이다.
예를 들어 안드로이드 플랫폼에 대한 쿠킹을 할 땐 텍스쳐 에셋의 RGB 포맷을  
안드로이드에서 더 효율적인 ETC 포맷으로 변환 시키는 것이다.     

 

- 패키징이란?
패키징이란 사용자에게 배포하기 위해 컨텐츠와 소스들을 컴파일, 빌드, 쿠킹, 패킹을
하는 일련의 과정이다.   

 

 

pak 

 

- pak이란?
원래 컨텐츠들이 각자 별개의 umap이나 uasset 같은 형태로 저장되 있는 걸 하나의 
파일로 묶은 형태다.     

 

- pak을 써야하는 이유
패치를 할 때 uasset을 이용하면 파일의 갯수가 많아 패치 속도가 느려지고, 압축이 안  되 용량도 더 크고, 보안성 부분에서도 취약하다. pak 파일을 이용하면 파일의 갯수가
줄어들고, 압축도 되 용량도 작아지고, 사용자가 바로 쓸 수 없는 형태로 uasset을 
변경해 보안성도 좋다.     

 

- pak 파일에 포함 된 것
pak 파일은 파일 리소스 구간, 파일 인덱스 구간, pak 파일 정보 구간, 총 3가지
구간으로 나누어진다. 파일 리소스 구간은 컨텐츠들이 저장되 있는 공간, 파일 인덱스
구간은 파일의 이름과 인덱스가 저장되 있는 공간, pak 파일 정보 구간은 pak 파일
전체에 대한 정보를 저장하고 있다.    

 

 

pak mount

 

pak을 마운팅 한다는 것은 컨텐츠를 실제로 로드해서 메모리에 올리는 것과는 다르다.
실제로 컨텐츠를 로드하기 할 때 이용하기 위해 컨텐츠가 있는 경로와 인덱스 정보
등을 저장해 두는 걸 마운팅 한다고 하는 것이다. pak 마운팅은 총 3가지 단계가
있다. 
      1. FPakFile 생성
      2. 패치 파일이면 우선 순위를 높인다
      3. FPakPlatformFile에 FPakFile을 추가시키고 정렬

 

1. FPakFile 생성


FPakFile을 생성해서 pak 파일의 전체 정보가 있는 부분과 파일 인덱스가 있는
부분을 읽어서 FPakFile에 저장하면 된다.

 

2. 패치 파일이면 우선 순위를 높인다


pak 파일이 패치 파일일 때(끝에 숫자_p.pak으로 끝나는 파일) 우선 순위를
높인다. 우선 순위는 100 + (숫자 * 100)이다.

 

3. FPakPlatformFile에 FPakFile을 추가시키고 정렬


생성한 FPakFile을 FPakPlatformFile의 배열에 추가하고 우선 순위에 따라
내림차순으로 정렬한다.FPakFile을 생성하고, 우선 순위를 정하고, 정렬하면 Mount 함수의 마운팅 과정이 끝나게 된다.       

 

- pak 파일의 우선 순위 ReadOrder
우선 순위란 pak 파일을 읽는 순서를 정하기 위한 것이다. pak 파일을 마운트하는
폴더에 따라서 pak 파일의 우선 순위가 첫 째로 결정되고 패치 파일인지 여부에 
따라서 또 우선 순위가 변경된다. 우선 순위가 높은 pak 파일에서 컨텐츠를 
로드했다면 보다 우선 순위가 낮은 pak 파일들에선 더 이상 그 리소스를 찾지 않는다.     

 

 

청크   

 

- 청크란?
프로젝트에서 pak 파일 포맷으로 기본 패키징을 하면 한 개의 pak이 생성된다.
이 한 개의 pak 파일을 여러 작은 pak 파일들로 쪼갤 수 있는데, 그 조각들을 청크라고
부른다. 한 개의 청크는 한 개의 pak 파일로 묶인다. 따로 청크로 지정을 안 한
컨텐츠들은 기본 청크인 청크0에 포함된다.      

 

- 청크를 만들어야 하는 이유
기본 패키징으로 생성한 pak 파일에는 모든 컨텐츠가 포함되기 때문에 용량이 매우 
크다. 패치를 할 때 이 한 개의  pak 파일을 이용한다면 속도나 용량 부분에서 매우 
비효율적이다. 이 것을 해결하기 위해서 청크를 쓰는데, 한 개의 pak을 이용할 때보다
훨씬 적은 용량을 패치할 수 있어서 효율적이다.     

 

- Primary Asset Label
청크를 생성하기 위해선 기본적으로 컨텐츠들을 작은 조각으로 나눌 수 있는 도구가 
필요하다. 그 도구가 바로 Primary Asset Label이란 데이터 에셋이다. Primary Asset
Label을 이용하면 원하는 컨텐츠들을 한 개의 청크로 묶을 수 있다. 디렉토리별로 
청크를 묶을 수도 있고, 참조하는 에셋들끼리 묶을 수도 있다.     

 

- 청크를 생성할 때 주의할 점
참조하는 에셋들끼리 묶는 경우 한 개의 리소스가 여려 개의 청크에 중복으로 포함 될
수도 있는데, 비록 우선 순위에 따라 리소스를 한 번만 로드 한다고 하더라도 여러
개의 pak 파일에 리소스가 중복으로 포함되기 때문에 비효율적이다. 이 것을 해결하기
위해선 종속성 설정을 해야 하는데, DefaultEngine.ini란 곳에서 설정해 줄 수 있다.    

 

 

패치 파일 생성     

 

- 패치 파일을 이용 하는 이유
여러 컨텐츠가 묶인 청크를 이용할 때, 청크 안에 있는 한 개의 리소스가 바뀌었다고
가정해본다. 패치를 할 때 리소스 한 개 용량 만큼만 패치를 하고 싶지만 리소스가
들어있는 청크 pak 파일 전체를 패치 해야한다고 하면 매우 비효율적일 것이다.  이 때
패치 파일을 이용하면 수정된 컨텐츠에 대한 파일을 생성해서 패치를 할 수 있게 된다.      

 

- 패치 파일 생성 원리(기준 릴리즈에서 변경된 부분 쿠킹 및 패치 파일에 추가)
패치 파일은 기준 릴리즈 버전의 쿠킹된 데이터와 현재 데이터를 비교해 변경된
컨텐츠들을 쿠킹해 패치 파일에 포함 시킨다.      

 

- 패치 티어에 관해
패치 파일은 청크_숫자_p.pak 이런 식으로 생성이 되는 걸 알 수 있다. 숫자로
표기되는 부분이 패치 티어에 관한 것인데, 한 개의 청크에 대해 여러 개의 패치를
하기 위해 쓴다. 숫자가 높을 수록 우선 순위가 높다.    

 

 

프로젝트 런처 이용하기     

 

- 프로젝트 런처란?
패키징은 기본 화면인 레벨 에디터 화면에서 File - Project Package - Platform을 
선택해서 할 수 있다. 이것을 기본 패키징이라고 말하는데, 설정할 수 있는 것이
한정적이기 때문이다. 빌드, 쿠킹, 패키징, 디플로이에 대한 세밀한 설정을 할 수
있는 도구가 바로 프로젝트 런처다.     

 

- 프로젝트 런처를 써야하는 이유
프로젝트 런처에선 기본 패키징에선 할 수 없는 것들을 할 수 있는데, 그 중 하나가 
패치 파일 생성이다.      

 

- 커스텀 프로파일 설정하기
프로젝트 런처에서 패키징 설정을 하기 위해선 커스텀 프로파일이란 걸 만들어야
한다. 커스텀 프로파일에선 빌드, 쿠킹, 패키징, 디플로이에 관한 설정들을 할 수 있다.     

 

- 커맨드 라인  
프로젝트 런처의 커스텀 프로파일 말고도 커맨드 라인을 이용해서 패치 파일을
생성할 수 있다. 엔진을 이용하지 않고 외부에서 패치 파일을 생성하고 싶을 때 
이용할 수 있다