젠 스토리지 서버(Zenserver)에서 데이터를 스트리밍하는 방법을 살펴보기 전에, 이 페이지의 지침에 따라 Zenserver를 쿠킹된 출력 저장소로 사용하기를 활성화했는지 확인합니다.
Zenserver 스트리밍을 사용하는 목적은 다음과 같습니다.
-
스테이징과 디플로이를 훨씬 빠르게 진행할 수 있습니다.
-
중간에 대규모 데이터를 변환할 필요 없이 게임이 로드되는 동일한 스토리지에 쿠킹할 수 있어 앞으로 더욱 직접적이고 효율적이며 타깃이 명확한 워크플로를 이용할 수 있습니다.
쿠킹/스테이징/디플로이 이해하기
Zenserver를 쿠킹된 출력 저장소로 사용하고 컨테이너 파일(*.pak, *.utoc, *.ucas)에 스테이징하는 경우, 다음과 같이 콘텐츠 파이프라인을 시각화할 수 있습니다.
쿠킹된 데이터는 쿠킹 단계에서 매우 세부적으로 Zenserver에 기록되고, Zenserver에서 읽어온 후, 스테이징 단계에서 집계된 .pak, .utoc, .ucas 파일에 기록됩니다.
이렇게 하면 타깃 디바이스에서 런타임 게임에 같은 동작을 유지하면서도 파일 수가 많아 발생하는 파일 시스템 오버헤드를 방지할 수 있습니다. 모든 데이터는 타깃 플랫폼의 로컬 디스크 데이터로 저장되며, 대부분 .pak, .utoc, .ucas 파일에 저장됩니다.
하지만 반복작업을 더 개선할 수도 있습니다. 모든 쿠킹된 데이터를 .pak, .utoc, .ucas 파일에 스테이징한 다음 데이터를 추가로 복사하여 해당 .pak, .utoc, .ucas 파일을 타깃 플랫폼으로 가져오는 과정에서 추가로 발생하는 데이터 복사를 제외하면 가능합니다.
바로 여기서 Zenserver의 네트워크 기능을 사용할 수 있습니다.
환경, 보안, 사용 사례
Zenserver 스트리밍을 활성화하기 전에, 네트워크 환경과 네트워크에서 Zenserver에 액세스를 허용하는 데서 오는 보안 영향을 고려해야 합니다.
Zenserver는 인증 없는 스토리지 서버입니다. 향후 인증이 추가될 수는 있지만, 현재는 사무실 LAN이나 VPN처럼 신뢰할 수 있는 환경에서만 사용하도록 설계되어 있으며, Zenserver에 접속할 수 있는 모든 사용자는 콘텐츠와 관련하여 완전한 읽기/쓰기/삭제 권한이 있습니다. 인터넷과 같은 공용 네트워크 환경이나 신뢰할 수 없는 네트워크 환경에서 원격 액세스를 통해 Zenserver를 사용하지 않은 것이 좋은데, 그 이유는 Zenserver에 저장된 DDC, 쿠킹된 출력 또는 기타 데이터 손실, 데이터 손상/오염, 데이터 유출이 발생할 수 있기 때문입니다.
Zenserver 스트리밍의 용도는 다음과 같습니다.
-
집이나 사무실 같은 신뢰할 수 있는 네트워크에서 사용하기 위해
-
디버그, 개발, 테스트 같은 비출시 빌드 구성에 사용하기 위해
-
워크스테이션의 Zenserver와 콘솔 또는 모바일 디바이스 같은 대상 플랫폼 간의 거리가 가까울 때 사용하기 위해
이러한 사용 사례에 해당되지 않는 상황이라면 컨테이너(.pak, .utoc, .ucas) 스테이징 워크플로를 계속 사용하고 Zenserver 스트리밍은 사용하지 않는 것이 좋습니다.
기본적으로 Zenserver는 다음과 같이 작동하도록 구성되어 있습니다.
-
네트워크의 다른 컴퓨터가 아닌 로컬 컴퓨터의 요청만 수신합니다.
-
로컬 컴퓨터의 프로세스가 Zenserver를 사용하려는 동안만 계속 실행됩니다.
Zenserver 스트리밍을 사용하려면 이 두 가지 항목을 모두 변경해야 합니다. 그래야 콘솔이나 모바일 같은 타깃 플랫폼에서 게임을 실행할 때 Zenserver가 실행되고 Zenserver에 연결할 수 있습니다. 디폴트 구성을 변경하는 방법은 아래의 Zenserver 스트리밍 활성화하기에 설명되어 있습니다.
Zenserver 스트리밍 사용 시, 콘텐츠 파이프라인을 다음과 같이 시각화할 수 있습니다.
Zenserver 스트리밍 활성화하기
앞서 환경, 보안 및 사용 사례에서 설명한 대로 신뢰할 수 있는 네트워크에 접속된 사실을 확인했다면, 네트워크의 다른 컴퓨터에서 들어오는 서비스 요청을 인식하고 언리얼 에디터가 더 이상 실행되지 않더라도 Zenserver를 계속 실행하는 방식으로 Zenserver를 시작하도록 환경설정을 변경해야 합니다.
요청을 인식하고 계속 실행되는 부분은 모두 언리얼 엔진의 환경설정으로 제어할 수 있으며, 이는 언리얼 에디터나 기타 툴에서 Zenserver를 시작하는 방식에 영향을 줍니다. 프로젝트의 DefaultEngine.ini 에 다음 내용을 추가합니다.
DefaultEngine.ini
[Zen.AutoLaunch]
LimitProcessLifetime=false
AllowRemoteNetworkService=true
위의 환경설정 라인을 추가한 후 에디터를 다시 시작하면 에디터를 종료한 후에도 Zenserver가 계속 실행되며, 자신의 타깃 플랫폼 등 다른 컴퓨터에서 보내는 네트워크 요청을 계속 처리하게 됩니다.
네트워크 또는 USB 연결 고려 사항
Zenserver 스트리밍 사용 시, 워크스테이션과 타깃 플랫폼의 네트워크 또는 USB 연결을 최대한 최적화하는 것이 중요합니다. 이렇게 하려면 다음을 수행해야 합니다.
-
가능한 경우 1Gbps 또는 10Gbps 유선 이더넷 연결을 사용합니다.
-
USB 3 속도를 지원하는 모바일 디바이스용 USB 3.2 Gen2(10Gbps) 케이블을 사용합니다.
-
WiFi 네트워크 연결은 사용하지 않습니다.
요구 사항은 타이틀의 디테일과 I/O 사용량에 따라 달라지므로, 위의 정보는 엄격한 요구 사항이 아닌 가이드라인일 뿐입니다. 에픽게임즈 내부적으로는 게임 안에서 1Gbps가 적당하며, 10Gbps 연결을 사용하면 Zenserver에서 스트리밍할 때 부팅/로드 시간이 더 빨라진다는 점을 확인했습니다.
컨테이너 파일 사용 없이 스테이징하기
Zenserver를 계속 실행해서 다른 컴퓨터의 요청을 처리할 수 있게 되면 pak/utoc/ucas 파일을 사용하지 않고도 스테이징을 통해 Zenserver를 활용할 수 있습니다. 콘텐츠 파이프라인에서 스테이징은 쿠킹 후 디플로이하기 전에 수행되는 작업입니다. 스테이징은 언리얼 자동화 툴(UAT)에 의해 수행되며, 수동으로 호출하거나 에디터의 버튼 또는 메뉴를 사용하여 호출할 수 있습니다. UAT 스테이징을 호출하면 다음 작업이 진행됩니다.
-
-pak실행인자를 전달받은 경우, 컨테이너(.pak/.utoc/.ucas) 파일에 스테이징됩니다. -
-pak실행인자를 전달받지 않은 경우, 컨테이너(.pak/.utoc/.ucas) 파일에 스테이징되지 않습니다.
Zenserver를 쿠킹된 출력 저장소로 사용하는 경우, 특히 컨테이너 파일 사용 없이 스테이징할 때 Zenserver 스트리밍을 사용합니다.
언리얼 에디터에서
기본적으로 언리얼 에디터에 내장된 디바이스에서 플레이(Play on Device) 기능은 컨테이너 파일(.pak/.utoc/.ucas)을 사용하지 않고 스테이징하도록 구성되어 있습니다.
편집(Edit) | 에디터 개인설정(Editor Preferences) 메뉴로 이동한 다음, 레벨 에디터(Level Editor) | 플레이(Play) 섹션을 선택하면 해당 환경설정을 확인하거나 확정할 수 있습니다. 해당 섹션에 디바이스에서 플레이 카테고리가 있고, 그 안에 실행용 파일 패킹(Pack Files for Launch) 세팅이 있습니다.
에디터에서 Zenserver 스트리밍을 사용하려면, 이 세팅을 Use loose files 로 설정해야 합니다. 이 세팅을 제대로 구성하면, 디바이스에서 실행하기에서 설명된 메커니즘을 사용하여 타깃 플랫폼에서 실행할 수 있습니다.
ushell에서
ushell은 언리얼 엔진의 명령줄 인터페이스로, 간략한 명령과 방대한 탭 완성 기능을 갖췄습니다. ushell은 Engine/Extras/ushell 아래에 있습니다. 퀵스타트 및 문서는 Engine/Extras/ushell/README.txt에서 확인할 수 있습니다.
Zenserver를 쿠킹된 출력 저장소로 환경설정한 경우, ushell의 .stage 명령은 자동으로 컨테이너가 아닌 워크플로(Zenserver 스트리밍)를 사용합니다.
ushell
.cook game <platform>
.stage game <platform>
.deploy game <platform>
.run game <platform>
Zenserver를 쿠킹된 출력 저장소로 활성화했고 컨테이너 파일에 스테이징하려는 경우, 위치 실행인자를 .stage 명령에 전달하여 컨테이너 파일에 스테이징하도록 명시적으로 요청해야 합니다.
ushell
.stage game <platform> development pak
위의 예시에서 4번째 위치 파라미터 pak 의 자리에 다음 파라미터를 사용할 수 있습니다.
-
pak: 스테이지징된 쿠킹 출력 데이터가 컨테이너(.pak,.utoc,.ucas) 파일에 저장됩니다. -
nopak: 스테이징된 쿠킹 출력 데이터가 파일 시스템의 패킹되지 않은 파일에 저장되며, 젠을 쿠킹된 출력 저장소로 사용하기(Zen as cooked output store) 를 활성화하면 Zenserver에 저장됩니다. -
zen: Zenserver를 쿠킹된 출력 저장소로 사용하기 를 활성화한 경우에는 스테이징된 쿠킹 출력 데이터가 Zenserver에 저장되고, 활성화하지 않은 경우에는 오류가 발생합니다. -
auto: (디폴트) Zenserver를 쿠킹된 출력 저장소로 사용하기 를 활성화한 경우에는 스테이징된 쿠킹 출력 데이터가 Zenserver에 저장되고, 활성화하지 않은 경우에는 컨테이너 파일에 저장됩니다.
사용자의 개발 환경/디버거에서
원하는 개발 환경이나 디버거에서 Zenserver 스트리밍의 사용은 자동으로 진행되어야 합니다. 게임 실행파일을 실행하면 ue.projectstore 파일의 유무를 확인합니다. 파일이 있으면, 게임은 Zenserver에 연결하여 쿠킹된 데이터를 가져오려 시도합니다.
ue.projectstore 파일은 간단한 JSON 포맷의 파일로, 게임이 Zenserver에 연결해서 쿠킹된 데이터를 가져오기 시작하는 데 필요한 호스트 이름, 포트, 기타 식별자 등의 정보를 포함합니다.
ue.projectstore 파일의 콘텐츠는 거의 모든 사례에 적합하겠지만, 연결 파라미터를 오버라이드해야 하는 경우, 하나 이상의 명령줄 실행인자를 게임 런타임에 전달하여 ue.projectstore 파일에 지정된 내용을 오버라이드할 수 있습니다.
ue.projectstore
-ZenStoreHost=<ip_or_hostname>
-ZenStorePort=<host_port_number>
-ZenStoreProject=<project_id>
-ZenStorePlatform=<platform_id>
Zenserver 스트리밍의 사용 여부 검사하기
Zenserver 스트리밍을 사용할 때는 Saved/StagedBuilds/<Platform> 폴더에 ue.projectstore 파일이 있어야 하며, 해당 폴더와 그 하위 폴더에 *.uasset 또는 *.pak/*.utoc/*.ucas 파일이 있어서는 안 됩니다.
디렉터리 콘텐츠 외에 게임 런타임(테스트가 아닌 디버그나 개발)이 있는 경우, 화면 왼쪽 상단에 'ZenServer streaming from …' 텍스트가 나타납니다.
다음과 같은 콘솔 명령을 실행할 수도 있습니다.
콘솔 명령
zen.showgraphs 1
그러면 시간 경과에 따른 Zenserver의 스트리밍 처리량을 화면에서 그래프로 확인할 수 있습니다.