쿠킹과 청킹

콘텐츠 쿠킹 및 배포용 .pak 파일을 만드는 방법입니다.

Windows
MacOS
Linux
추가 참고

에디터 이외 플랫폼에서 릴리즈 또는 테스트용으로 게임을 쿠킹할 때, Chunking (청킹)을 사용하여 데이터를 다수의 .pak 파일로 분할한 뒤 독립적으로 디플로이할 수 있습니다. Chunk (청크)란 별도로 디플로이 및 다운로드할 수 있는 애셋 컬렉션에 숫자를 붙인 것입니다. 생성되는 첫 청크 번호는 0 이며, 기본적으로 프로젝트에 사용되는 모든 콘텐츠가 포함됩니다. 엔진의 패키징 시스템을 사용하면 각 청크는 별도의 .pak 파일로 생성되고, 이를 플랫폼별 디플로이 시스템에 통합시킬 수 있습니다. 청킹 기능은 애셋 매니저에 완전 통합되어, Primary Asset Labels (프라이머리 애셋 라벨) 또는 Rules Overrides (룰 오버라이드)로 셋업할 수 있습니다. 청킹의 가장 좋은 예는 ShooterGame 샘플 프로젝트에서 찾을 수 있습니다. ShooterGame 은 세 개의 청크를 만듭니다. 청크 1 은 "Sanctuary" 맵, 청크 2 는 "Highrise" 맵, 청크 0 은 그 외 모든 데이터가 들어갑니다. ShooterGame 의 경우, 프라이머리 애셋 라벨을 선택했는데, 여기서는 두 메서드 다 살펴보도록 하겠습니다.

청킹을 구성할 때 커스텀 Asset Manager (애셋 매니저) 서브클래스를 생성하여 특정 가상 함수를 오버라이드하는 것이 좋을 수 있습니다. 규모가 큰 게임의 경우, 이렇게 할 것을 강력 추천합니다. 예를 들어 SetPrimaryAssetRules 함수를 오버라이드하여 게임 전용 애셋 규칙을 구성, 예로 특정 청크에 일부 콘텐츠를 할당해야 할 수 있습니다. 또한 특정 프라이머리 애셋 ID 에 관리되는 애셋을 결정하기 위해 호출되는 ShouldSetManager 함수를 오버라이드할 수도 있습니다. 각 프로젝트는 개별 프로젝트의 필요에 따라 청크에 콘텐츠를 할당하는 별도의 커스텀 규칙이 있을 수 있습니다. 애셋 매니저는 원래 확장해서 필요에 따라 커스터마이징하는 용도입니다.

프라이머리 애셋 규칙

Primary Asset Rules (프라이머리 애셋 규칙)은 어느 프라이머리 애셋이 어느 세컨데리 애셋에 대한 관리 권한이 있는지와 아울러, 쿠킹 프로세스 도중 애셋 처리 방식을 결정하는 데도 사용됩니다. 이러한 규칙은 FPrimaryAssetRules 구조체로 정의되며, 애셋 매니저 에서 쿠킹 시간에 애셋 처리 방법을 결정하는 데 사용됩니다. FPrimaryAssetRules 에서 사용할 수 있는 옵션 관련 상세 정보는, 해당 API Page 를 참고하세요. EPrimaryAssetCookRule API Page 에 정의된 Cooking Rules 를 찾아보는 것도 좋습니다.

프라이머리 애셋 라벨

Primary Asset Label (프라이머리 애셋 라벨)은 UPrimaryDataAsset 클래스의 최소 오버라이드이며, 이를 구성하여 청킹 및 쿠킹을 위한 다른 애셋을 지정하는 데 사용합니다. 보통 게임 도중 로드되지는 않지만, 쿠킹 및 청킹을 할 때 사용되며, 별도의 규칙, 목록, 기타 프로젝트 애셋에 대한 우선권을 구성할 수 있습니다. ShooterGame 의 경우, 라벨을 만들어 여러 청크에 들어가는 애셋을 지정하였습니다.

애셋을 명시적으로 지정하는 것 말고도, Label Assets In My Directory (내 디렉터리의 라벨 애셋)을 사용해서 라벨을 구성하면 디렉터리의 모든 애셋을 관리할 수 있습니다. 또는 Asset Collection (애셋 컬렉션) 필드를 사용해서 에디터 컬렉션 의 모든 애셋을 관리할 수도 있습니다.

HighriseLabel.png

이 "HighriseLabel" 라는 프라이머리 애셋 라벨은 게임의 "Highrise" 맵 애셋을 명시적으로 관리하며, 청크 2 에 속한다는 것을 나타냅니다.

이 시점에서, "Highrise" 에 대한 애셋은 별도의 Primary Asset ID (프라이머리 애셋 ID) "Map:/Game/Maps/Highrise" 는 물론, "HighriseLabel" 의 프라이머리 애셋 ID "PrimaryAssetLabel:HighriseLabel" 도 할당되어 있습니다. 맵에는 별도의 청크 ID 가 없기때문에, 청킹 프로세스는 "HighriseLabel" 에서 찾은 청크 ID, 즉 2 를 사용할 것입니다. 추가로 맵의 모든 Secondary Assets (세컨데리 애셋)은 청크 2 에 할당됩니다. "Sanctuary" 맵과 청크 1 에 대해서도 비슷한 구성을 해줘야 할 것입니다. 청크 ID 가 (음수이거나) 없는 애셋은 기본 .pak 파일이자, 프로젝트의 스타트업 맵인 "ShooterEntry" 가 저장되는 Chunk 0 으로 갑니다. 다수의 프라이머리 애셋 라벨에 참조된 세컨데리 애셋은 그 라벨 중 우선권이 가장 높은 것에 할당됩니다. 다수의 라벨이 최고 우선권으로 묶여있는 경우, 애셋은 각 라벨에 할당됩니다.

ReferenceViewer.png

레퍼런스 뷰어에 프라이머리 애셋 라벨과 레벨 맵 사이 관리 관계가 표시됩니다.

Management.png

"Map:/Game/Maps/Highrise" 에 더블클릭하면 "PrimaryAssetLabel:HighriseLabel" 에 관리된다고 나옵니다.

룰 오버라이드

Rules Overrides (룰 오버라이드)는 특정 프라이머리 애셋에 대한 우선권과 청크 세팅을 수립하는 데 사용됩니다. ShooterGame 의 3 청크 구성을 만드는 데 프라이머리 애셋 라벨 대신 룰 오버라이드를 사용하려면, DefaultGame.ini 에 다음과 같은 섹션을 만들어야 합니다:

[/Script/Engine.AssetManagerSettings]
+PrimaryAssetRules=(PrimaryAssetId="Map:/Game/Maps/Sanctuary",Rules=(Priority=-1,ChunkId=1,CookRule=Unknown))
+PrimaryAssetRules=(PrimaryAssetId="Map:/Game/Maps/Highrise",Rules=(Priority=-1,ChunkId=2,CookRule=Unknown))
+PrimaryAssetRules=(PrimaryAssetId="Map:/Game/Maps/ShooterEntry",Rules=(Priority=-1,ChunkId=0,CookRule=AlwaysCook))

DefaultGame.ini 파일의 쿠킹 및 청킹 규칙입니다. 이 예제에서는 스타트업 맵인 "ShooterEntry" 에 명시적 레퍼런스를 추가했습니다.

이렇게 하면 메인 게임 맵이 특정 청크에 있도록 하여, 그 레퍼런스 전부가 해당 청크에도 추가되도록 만듭니다. 청크 0 을 관장하는 최종 항목은, 게임 첫 시작 시 로드되는 맵에 참조되는 것들이 기본 청크이기도 한 청크 0 에 들어가도록 해줍니다. 우선권 값이 -1 이면 우선권을 기본값인 1 로 설정합니다.

애셋 대 청크 할당 분석

엔진에는 청크를 검사(audit)할 수 있는 몇 가지 툴이 내장되어 있습니다. 이 툴을 사용하면, 어느 애셋이 어느 청크에 왜 할당되었는지 알 수 있습니다.

애셋 검사 창

Asset Audit Window (애셋 검사 창)은 Windows (창) 드롭다운 메뉴에서 Developer Tools (개발자 툴)을 펼치고 Asset Audit (애셋 검사)를 선택하면 됩니다.

AssetAuditInMenu.png

AssetAuditEmpty.png

Add Chunks (청크 추가) 버튼을 클릭하면 현재 프로젝트에 존재하는 모든 청크의 요약 정보가 창에 채워집니다.

AssetAuditPopulated.png

ShooterGame 에서 애셋은 세 개의 청크로 배포됩니다.

개별 청크를 조사하려면, 우클릭하고 Size Map (사이즈 맵) 또는 Reference Viewer (레퍼런스 뷰어)를 선택합니다.

AssetAuditRightClick.png

사이즈 맵

Size Map (사이즈 맵)은 청크 안에 들어있는 각 애셋의 유형과 크기를 시각적으로 보여줍니다. 애셋은 박스에 아이콘 또는 섬네일과 함께 컬러 박스로 표시되고, 애셋의 크기에 따라 스케일이 조절됩니다. 다른 박스 안에 중첩된 박스는 부모-자손 관계를 나타냅니다. 예를 들어, 머티리얼이 참조하는 텍스처는 머티리얼의 박스 안에 표시되는데, 머티리얼을 로드하면 암시적으로 텍스처를 로드하기 때문입니다.

ShooterGame 에서 청크 0 에는 게임 메뉴를 표시하고 경기에 들어가는 데 필요한 애셋이 들어 있는 반면, 청크 1 과 1 는 게임을 플레이하는 맵에 사용됩니다. 따라서 청크 0 은 다른 청크보다 작으며, 애셋 유형이 더 다양합니다. 청크 0 과 1 의 애셋 분석 및 출시 버전의 총 디스크 크기는 다음과 같습니다.

SizeMapChunk0DiskSize.png

ShooterGame 의 청크 0 에는 독립 애셋이 많지만 비교적 작습니다.

SizeMapChunk1.png

청크 1 (그림) 및 청크 2 는 게임이 진행되는 개별 맵이 포함되어 있어, 하나의 커다란 연결 애셋 그룹이 특징입니다.

사이즈 맵은 포함된 애셋의 (에디터 내) 메모리 사용량 시각화도 지원합니다. 에디터내 메모리 크기는 출시된 제품에서 똑같은 애셋 그룹의 디스크 사용량과 크게 다를 수 있습니다.

SizeMapChunk0MemorySize.png

청크 0 을 메모리 크기 모드로 표시한 것입니다. 이 모드는 에디터 내 애셋의 메모리 사용량에 따라 박스 크기를 조절합니다.

개별 애셋은 애셋의 박스를 우클릭해서 조사하고 편집할 수 있습니다. 마우스 휠을 사용해서 줌 인 또는 아웃 하거나, 애셋을 더블클릭해서 창에 맞게 확장할 수 있습니다.

SizeMapChunk0RightClick.png

"로딩 화면" 텍스처 애셋에 대한 우클릭 메뉴입니다.

레퍼런스 뷰어

레퍼런스 뷰어 는 애셋들 사이 상호 연결된 참조 관계를 나타내는 그래프를 생성합니다. 청크와 개별 애셋을 이 툴에서 조사할 수 있습니다. ShooterGame 예제에서 Chunk 1 을 조사해 보면 직접 연결된 애셋이 "Sanctuary" 맵과 청크 1 이 할당된 프라이이머리 애셋 라벨 둘 뿐입니다.

ReferenceViewerChunk1.png

레퍼런스 뷰어에서 본 ShooterGame 의 청크 1 에 직접 참조된 애셋의 그래프입니다. Sanctuary 맵 애셋의 노드를 우클릭했습니다.

콘텐츠 브라우저 또는 레퍼런스 뷰어에서 노드에 우클릭하고 "Re-Center Graph" (그래프 중심 재설정)을 선택하거나 레퍼런스 뷰어에서 노드에 더블클릭하면 해당 노드의 레퍼런스가 표시됩니다. 다음 이미지는, 청크 1 에서 "Map:/Game/Maps/Sanctuary" 노드로 중심을 재설정하여, 그 "Sanctuary" 맵이 왼쪽에는 두 (청크 1 및 청크 1의 프라이머리 애셋 라벨) 노드에 참조된 것을, 오른쪽에는 "M_FFA_Wall_01" 머티리얼과 같은 여러 자손 노드를 참조하는 것을 보이고 있습니다.

ReferenceViewerChunk1Map.png

ShooterGame 의 (청크 1 일부인) "Sanctuary" 맵을 조사한 것입니다.

위 그래프는 전체가 아닙니다. 레퍼런스 뷰어 옵션 설정에 따라 제한된 것입니다. 그래프 범위를 제한하면 엔진의 빌드 시간을 크게 줄일 수 있습니다. 그 옵션 관련 자세한 정보는 레퍼런스 뷰어 문서를 참고하세요.

이런 식으로 레퍼런스를 파고 들어가 보면, 어떤 애셋이 다른 애셋이나 청크에 연관된 이유를 정확히 알 수 있습니다. 불필요한 애셋 레퍼런스를 발견 또는 제거하거나, 프로젝트의 필요에 더 잘 맞게 청킹 전략을 조정할 수 있습니다.

Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼