우들 네트워크

우들 네트워크를 사용하여 프로젝트의 스트리밍 퍼포먼스를 개선하는 방법을 간략하게 살펴봅니다.

Choose your operating system:

Windows

macOS

Linux

우들 네트워크(Oodle Network) 는 네트워크 스트리밍에 대한 압축 시스템을 노출합니다. 우들 네트워크를 프로젝트에 통합하는 것은 다른 우들 솔루션보다 더 실무적인 과정으로서, 패킷을 캡처하고 BaseEngine.ini 에 익숙해야 하며 오프라인 컴프레셔 '훈련'이 필요합니다. 우들 네트워크는 오프라인 훈련 단계를 통해 압축 시간을 크게 단축합니다.

우들 네트워크 구성

다음은 우들 네트워크 사용에 필요한 단계를 요약한 것입니다.

  1. 우들 네트워크 플러그인이 활성화되었는지 확인합니다.

  2. 최대한 사실적인 데이터를 사용하여 온라인 게임플레이의 패킷 데이터를 캡처합니다.

  3. 런타임 시 사용하기 위한 딕셔너리 파일을 생성하는 컴프레서를 훈련합니다.

  4. 생성된 딕셔너리 파일을 사용하도록 우들 네트워크를 환경설정합니다.

  5. 딕셔너리 파일이 게임과 함께 패키지로 만들어지는지 확인합니다.

이러한 단계에 대한 자세한 내용은 아래 섹션에서 확인할 수 있습니다.

우들 네트워크 활성화하기

우들 네트워크 플러그인

플러그인 자체는 기본적으로 활성화되어야 하며, 스타트업 로그에 다음과 같은 내용이 표시되어야 합니다.

LogPluginManager: Mounting plugin OodleNetwork

하지만, 네트워크 스트림으로 작업할 때는 이 플러그인을 사용한다고 언리얼 엔진에 알려야 합니다. 그러려면, BaseEngine.ini 파일에서 다음과 같은 네 부분을 편집해야 합니다.

BaseEngine.ini

[GameNetDriver PacketHandlerProfileConfig]
+Components=OodleNetworkHandlerComponent
[PendingNetDriver PacketHandlerProfileConfig]
+Components=OodleNetworkHandlerComponent
[DemoNetDriver PacketHandlerProfileConfig]
+Components=OodleNetworkHandlerComponent
[PacketHandlerComponents]
Components=OodleNetworkHandlerComponent

이러한 변수는 언리얼 엔진이 네트워크 스트림에 우들 네트워크를 사용하도록 합니다. 첫 번째 세 항목은 관련 넷 드라이버(Net Drivers)에 대한 컴포넌트를 지정합니다. 주어진 넷 드라이버에 대해 컴포넌트를 지정하지 않으면 언리얼 엔진은 PacketHandlerComponents 섹션을 확인합니다.

패킷 핸들러는 활성화된 연결에서만 생성되므로 디버깅할 때 코드 레벨의 디버깅을 수행하려면 실제 클라이언트와 연결해야 할 수도 있습니다.

또한, 우들 네트워크는 환경설정을 위해 BaseEngine.ini 파일에서 다음과 같은 파일 블록을 찾습니다.

BaseEngine.ini

[OodleNetworkHandlerComponent]
bEnableOodle=true
PacketLogFile=PacketDump
ServerDictionary=
ClientDictionary=
ServerEnableMode=AlwaysEnabled
ClientEnableMode=AlwaysEnabled

세팅

설명

bEnableOodle

false로 설정하면, 우들은 어떤 데이터도 압축하지 않습니다.

PacketLogFile

패킷 데이터 캡처 시 작성할 파일명의 접두사를 정의합니다.

ServerDictionary

훈련 단계에서 생성된 서버 측 딕셔너리 파일의 경로입니다. 이 파일은 게임 패키징 시 포함되어야 합니다.

ClientDictionary

훈련 단계에서 생성된 클라이언트 측 딕셔너리 파일 경로입니다. 이 파일은 게임 패키징 시 포함되어야 합니다.

ServerEnableMode

특정 메모리 제약이 있는 플랫폼에서 조건에 따라 압축을 비활성화할 수 있습니다. 옵션은 다음과 같습니다.

  • AlwaysEnabled : 옵션 이름에서 알 수 있듯이, 이 옵션을 설정하면 우들 네트워크가 항상 활성화됩니다.

  • WhenCompressedPacketReceived : 이 옵션을 설정하면 압축된 패킷이 수신되지 않는 한 서버 측 딕셔너리가 초기화되지 않습니다.

ClientEnableMode

특정 메모리 제약이 있는 플랫폼에서 조건에 따라 압축을 비활성화할 수 있습니다. 옵션은 다음과 같습니다.

  • AlwaysEnabled : 옵션 이름에서 알 수 있듯이, 이 옵션을 설정하면 우들 네트워크가 항상 활성화됩니다.

  • WhenCompressedPacketReceived : 이 옵션을 설정하면 압축된 패킷이 수신되지 않는 한 클라이언트 측 딕셔너리가 초기화되지 않습니다.

패킷 데이터 캡처

특수 모드에서 우들 네트워크를 활성화하여 게임을 플레이하면 패킷 캡처가 이루어집니다. 이러한 패킷 캡처 퀄리티는 압축 퀄리티에 영향을 미치므로 패킷 캡처를 위한 플레이는 일반적인 플레이를 대표해야 합니다.

어떤 실행 파일이 서버 역할을 하든 -OodleCapturing 과 함께 실행되어야 합니다.

UE4Editor.exe ShooterGame -game **-OodleCapturing** -windowed -log

클라이언트는 -OodleCapturing 없이 연결되어야 합니다.

UE4Editor.exe ShooterGame -game -windowed -log

패킷 캡처는 프로젝트 및 환경설정을 위해 Saved/Oodle 디렉터리에 작성됩니다. 훈련용으로 적절한 대표 데이터 세트를 생성하려면 많은 패킷 캡처(50MB 이상)를 수집해야 합니다. 디렉터리에 있는 모든 패킷 캡처를 사용하여 훈련이 진행됩니다.

훈련

우들 네트워크 트레이너는 모든 패킷 캡처를 읽고 딕셔너리를 생성하는 커맨드릿입니다. 이러한 딕셔너리는 서버와 클라이언트 간 네트워크 스트림 압축에 사용됩니다.

다음은 트레이너 커맨드릿을 실행하는 명령어입니다.

UE4Editor.exe ShooterGame -run=OodleNetworkTrainerCommandlet AutoGenerateDictionaries -CompressionTest

디폴트 딕셔너리 크기는 4MB이며 -DictionarySize=(size in bytes) 명령줄 옵션으로 오버라이드될 수 있습니다.

트레이너는 우들 네트워크가 패킷 캡처를 작성한 것과 같은 디렉터리에서 패킷 캡처를 읽고 Content/Oodle 디렉터리에 결과 딕셔너리를 작성합니다.

Content/Oodle/ShooterGameInput.udic
Content/Oodle/ShooterGameOutput.udic

로그에는 생성된 딕셔너리로 달성된 압축률이 기록됩니다.

OodleNetworkHandlerComponentLog: Compression test results:
OodleNetworkHandlerComponentLog: - CompressionTestPackets: 380, Size: 10428 (~0MB)
OodleNetworkHandlerComponentLog: - Uncompressed: 10428 (~0MB), Compressed: 6699 (~0MB)
OodleNetworkHandlerComponentLog: - Total Savings: 35.759495

이 시점에서 훈련이 완료됩니다.

게임이 패치 간에 눈에 띄게 변경되는 경우 새로운 패킷 캡처에 대해 우들 네트워크를 다시 훈련하고 패치와 함께 새 딕셔너리를 출시해야 합니다.

환경설정

서버 측 딕셔너리와 클라이언트 측 딕셔너리는 BaseEngine.ini 파일에 지정되어야 합니다.

ServerDictionary=Content/Oodle/ShooterGameOutput.udic
ClientDictionary=Content/Oodle/ShooterGameInput.udic

환경설정이 완료되면, stat OodleNetwork 명령을 사용할 수 있어야 하며 통계가 활성화된 게임에서 실시간 압축률을 확인할 수 있어야 합니다.

패키징

타깃 플랫폼에 대해 우들 네트워크가 활성화되어 있는 한, 딕셔너리 파일은 자동으로 포함됩니다. pak 파일의 콘텐츠를 나열하고 관련 항목을 검색하여 이를 확인할 수 있습니다.

UnrealPak.exe Path\To\ShooterGame\Saved\StagedBuilds\WindowsNoEditor\ShooterGame\Content\Paks\ShooterGame-WindowsNoEditor.pak -list

...
LogPakFile: Display: "ShooterGame/Content/Maps/ShooterEntry_BuiltData.uasset" offset: 326025216, size: 735 bytes, sha1: BF611DF661BA7260E086145D328AC09E9E1149FB, compression: None.
LogPakFile: Display: "ShooterGame/Content/Maps/ShooterEntry_BuiltData.uexp" offset: 326026004, size: 286 bytes, sha1: 44DB46D2C5EC43395C2659E97D4B94DCE0064E6A, compression: Oodle.
LogPakFile: Display: "ShooterGame/Content/Oodle/ShooterGameInput.udic" offset: 326027264, size: 46416 bytes, sha1: 95EE01894C1E72CD12105652186515573E42C3FE, compression: Oodle.
LogPakFile: Display: "ShooterGame/Content/Oodle/ShooterGameOutput.udic" offset: 326074368, size: 24339 bytes, sha1: EE0602B1263815475FE75BA5D953D7A7963CAF71, compression: Oodle.
LogPakFile: Display: "ShooterGame/Content/ShaderArchive-Global-PCD3D_SM5.ushaderbytecode" offset: 326100992, size: 5427343 bytes, sha1: 129EED3E7BB14E54ACEB72F4A5D813CD1F8E5FA6, compression: None.
...

암호화 키 검색 오류가 발생하면, 이 테스트에 -skipencryption 으로 패키징을 시도해 보세요.