데모 넷 드라이버 및 스트리머

게임플레이 녹화 및 재생을 위한 리플레이 시스템 개요입니다.

DemoNetDriver (데모 넷 드라이버)는 Streamers (스트리머)를 사용하여 리플레이 재생에 필요한 정보를 추출하고 기록합니다. 리플레이 데이터 시청 방식에 따라 엔진에 포함된 여러 다양한 스트리머를 DemoNetDriver 에 붙일 수 있습니다. Local File Streamer (로컬 파일 스트리머)가 기본으로, 호스트 머신의 이벤트를 디스크에 바로 기록하므로 싱글 플레이어 게임 및 리플레이를 로컬에서 재생하는 게임에 적합하며, 호스트 플레이어의 자체 머신에서 벌어집니다. 로컬 파일 스트리머의 다른 버전인 Save Game Streamer (세이브 게임 스트리머)는 리플레이를 세이브 게임 슬롯에 기록하므로 특히 콘솔에 좋으며, 리플레이 재생 및 관리 기능도 제공합니다. Memory Streamer (메모리 스트리머)는 클라이언트 머신에서 실행되어 데이터를 메모리에 저장하므로, 스포츠 게임의 "즉석 리플레이" 또는 슈팅 게임의 "킬 캠" 에 이상적입니다. 마지막으로 HTTP Streamer (HTTP 스트리머)는 리플레이 데이터를 LAN 또는 인터넷을 통해 다른 머신에 전송할 때 쓰이며, 데디케이티드 서버 게임 및 많은 수의 시청자에게 라이브 스트리밍 방송을 하면서도 반응 속도는 좋게 유지해야 하는 경우 좋습니다.

데모 넷 드라이버 기능

  • DemoNetDriver (데모 넷 드라이버)는 기본적으로 Local File Streamer (로컬 파일 스트리머)를 사용하나, ReplayStreamerOverride 옵션에 InMemoryNetworkReplayStreaming 또는 HttpNetworkReplayStreaming 처럼 다른 Streamer Factory (스트리머 팩토리) 모듈을 주는 것으로 덮어쓸 수 있습니다. 기본값 LocalFileNetworkReplayStreaming 은 프로젝트 DefaultEngine.Ini 파일 내 NetworkReplayStreaming 섹션의 DefaultFactoryName 변수를 설정하는 것으로 바꿀 수 있습니다. 이는 InitBase 를 호출하고 적당한 URL 인수를 파라미터로 제공하는 것으로도 변경할 수 있습니다.

  • DemoNetDriver 는 demo.CheckpointSaveMaxMSPerFrame 콘솔 변수를 양수 값으로 설정하여 리플레이 데이터를 녹화하는 데 드는 시간 비용을 분산시킬 수 있습니다. 프레임당 시간 제한 만료 전 리플레이에 녹화되지 않는 액터는 대기열에 등록되어 다음 프레임에 녹화됩니다. 이 기능의 장점은 체크포인트 녹화 및 테이크에 드는 시간에 상한선을 두어 게임의 멈춤 현상을 방지하는 데 도움이 됩니다. 단점이라면 액터에 대한 데이터가 들어있는 체크포인트를 여러 프레임에 걸쳐 찍었기 때문에 재생 도중 약간의 시각적 오류가 발생할 수 있다는 점입니다. 이 기능은 게임에서 체크포인트 녹화를 위해 지정한 시간 제한보다 오래 걸렸을 경우에만 발동되는 것으로, 저사양 머신 또는 퍼포먼스를 많이 요하는 게임에 주로 적용된다는 뜻입니다.

  • bPrioritizeActors 옵션이 true 설정된 경우, 리플레이에 저장되는 액터는 GetReplayPriority 가상 함수를 통해 우선권 순으로 미리 정렬하여 녹화 순서를 정합니다. MaxDesiredRecordTimeMS 를 통한 분산 녹화와 함께 쓸 때 좋습니다.

  • 체크포인트 녹화 빈도는 demo.CVarCheckpointUploadDelayInSeconds 콘솔 변수로 조절 가능합니다. 기본값은 30 초입니다. 체크포인트 사이 기간을 늘리면 리플레이를 앞뒤로 문질러 이동하는 작업이 느려지나, 리플레이 크기가 줄어들 것입니다.

  • bPauseRecording 변수를 true 로 설정하면 데모 녹화 도중 녹화를 임시로 정지시킬 수 있습니다. 다시 false 로 설정하면 녹화가 재개됩니다.

  • Game Mode 는 리플레이를 볼 때 (ReplaySpectatorPlayerControllerClass 로 지정된) 다른 Player Controller 클래스를 사용합니다.

  • SetViewerOverride 를 사용하면, DemoNetDriver 는 녹화 목적으로 사용되는 대체 Player Controller 를 만들어 액터의 네트워크 연관성, 컬링, 우선순위 결정 방식을 변경할 수 있습니다. 이는 맵이 큰 게임에서, 플레이어가 플레이 도중 멀리서 일어나는 일을 (효율은 물론이고 치트 방지 목적으로도) 항상 알 수는 없지만, 리플레이를 확인할 때는 모든 것을 볼 수 있도록 하려는 경우 좋습니다.

  • DemoNetDriver 는 Slate 와의 병렬 처리가 가능합니다. 이를 위해서는 tick.DoAsyncEndOfFrameTasksdemo.ClientRecordAsyncEndOfFrame 콘솔 변수 모두 0 이외의 값이어야 합니다.

리플레이 생성 액터는 라이브 게임플레이 액터와 마찬가지로 함수 호출을 합니다. 이는 라이브 액터처럼 행동하여 리플레이 데이터를 최소화시킬 수 있으나, GameInstance, GameState, GameMode 와 같은 공유 오브젝트에 영향을 주는 함수 호출이 리플레이 액터에서도 여전히 사용 가능하여, 게임의 상태에 원치 않는 방식으로 영향을 줄 수 있다는 뜻이 되기도 합니다. 메모리 스트리머의 경우가 특히나 그러한데, 현재 플레이중인 라이브 게임플레이를 바로 시청하는 경우입니다. 액터가 영향을 주지 말아야 할 것에 대한 보호장치로, 그러한 작업은 액터가 라이브인지 리플레이 레벨의 일부인지 먼저 확인한 후 그에 맞게 처리하도록 하는 것입니다. 이는 거의 게임 전용 문제일 것이며, 각 프로젝트에서 건별로 처리해 줘야 합니다. 어떤 게임에서 리플레이 도중 플레이어의 생명력 막대나 전체화면 피해량 오버레이 표시는 업데이트하면서, 플레이어의 점수는 변경하지 않는 것을 예로 들 수 있습니다.

리플레이 데이터 포맷

데이터 측면에서 리플레이에는 세 가지 유형의 게임 상태 정보와 아울러 약간의 텍스트 데이터가 추가로 저장됩니다. 시작 부분은 게임 월드의 시작 상태를 설명하는 기준 데이터입니다. (기준에서) 월드에 가해지는 전체 변경사항의 스냅샷 역할을 하는 체크포인트는, 정기적인 사용자 지정 간격으로 나타납니다. 그 후 체크포인트 사이 간격을 월드의 개별 오브젝트에 대한 점증적 변화량으로 채웁니다. 게임 내 어떤 순간도 엔진에서 빠르고 정확하게 재구성할 수 있습니다. 월드를 시작 상태로 초기화시키고, 선택한 시간 이전의 체크포인트에 설명된 상태로 만든 뒤, 가장 최근 체크포인트 이후 지정된 시간 직전까지의 점증적 변화를 적용시키는 것입니다. 리플레이에 포함된 텍스트 데이터는, 플레이어가 보는 목록을 만드는 데 사용할 수 있는 표시명, 게임 목록의 검색 또는 필터링에 사용할 수 있는 (HTTP 스트리머 전용) 사용자 정의 텍스트 태그로 구성됩니다.

로컬 파일 스트리머

Local File Streamer (로컬 파일 스트리머)는 리플레이 데이터를 (하드 드라이브같은) 로컬 저장 장치의 단일 파일에 비동기 기록합니다. 언리얼 엔진 4.20 버전에 처음 도입되면서 Null Streamer (널 스트리머) 대신 기본 스트리머가 되었습니다. 로컬 파일 스트리머의 단일 파일 출력 기능으로 저장된 리플레이 배포와 관리가 쉽고, 비동기 기록 기능으로 콘솔처럼 하드 드라이브 속도가 낮은 시스템의 퍼포먼스가 향상됩니다. 리플레이 데이터 파일은 프로젝트의 "Saved/Demos/" 폴더에 저장되며, 확장자는 ".replay" 입니다.

로컬 파일 스트리머는 널 스트리머가 기록한 파일과 호환되지 않습니다. 프로젝트가 로컬 파일 스트리머를 사용하면서 널 스트리머가 기록한 리플레이와 하위 호환성을 유지하려면, 널 스트리머를 포함시켜야 합니다. 그렇게 해도 앞으로 프로젝트가 로컬 파일 스트리머를 사용하지 못하게 되지는 않습니다.

게이브게임 리플레이 스트리머

SaveGame Replay Streamer (세이브게임 리플레이 스트리머)는 리플레이를 savegame (세이브게임) 슬롯에 더하는 기능이 추가된 로컬 파일 스트리머의 특수 버전입니다. 이를 사용하면 클라이언트측 리플레이를 저장한 다음 플랫폼의 보통 세이브게임 로드용 인터페이스를 통해 로드할 수 있습니다. 이 스트리머는 세이브게임 시스템 없이도 리플레이를 보관, 저장, 로드할 수는 있지만, 세이브게임 슬롯에 복사되지 않은 리플레이 식별, 복사 수행, 리플레이 재생 또는 삭제 등의 작업을 로컬 파일과 세이브게임 슬롯 양쪽에서 할 수 있는 보조 API 활용이 주 목적입니다.

널 스트리머

Null Streamer (널 스트리머)는 리플레이 데이터를 로컬 하드 드라이브 등의 디스크에 직접 씁니다. 로컬 녹화 제작, 특히나 싱글 플레이어 게임에 좋습니다. 이 녹화는 여러가지 용도에 매우 좋은데, 게임플레이 트레일러나 게임내 컷씬 영상 제작, 또는 사용자가 게임 내 튜토리얼이나 타임어택 비디오 시청 및 공유를 할 수 있도록 해줍니다. 리플레이 데이터 파일은 프로젝트의 Saved/Demos/(리플레이 이름) 폴더에 저장됩니다.

널 스트리머는 언리얼 엔진 4.20 전까지 리플레이 녹화 기본 방식이었습니다. 폐기되긴 했지만 예전 리플레이를 재생할 수 있도록 하위 호환성을 유지하고 있습니다.

메모리 스트리머

Memory Streamer (메모리 스트리머)는 사용자가 지정할 수 있는 실행 길이의 리플레이 데이터를 로컬 머신의 메모리에 유지합니다. 이러한 스트리밍 유형은 스포츠 게임에서의 득점이나 슈팅 게임에서의 사망, 또는 액션 게임에서의 최종 보스 처치 장면 등 최근의 극적인 순간에 대한 즉석 리플레이에 최적화되어 있습니다.

메모리 스트리머 사용법 세부사항

메모리 스트리머는 하나의 세션 도중 녹화와 재생, 게임플레이가 재개되도록 되어있다는 점에서 특별합니다. 플레이어가 리플레이를 시청하는 도중 라이브 게임은 모습도 소리도 없이 계속 진행시키고, 리플레이가 끝나면 매끄럽게 게임이 이어지도록 할 수 있습니다. 로드 시간에 엔진은 레벨을 스태틱 레벨, 다이내믹 소스 레벨, 다이내믹 복제 레벨의 세 그룹으로 모읍니다. 이 그룹을 통해 라이브 게임플레이 및 리플레이 시스템과의 레벨 상호작용 방식을 다음과 같이 결정합니다:

레벨 그룹

이 그룹에 추가된 레벨

작동방식

스태틱 레벨

퍼시스턴트 레벨이 아니면서 IsStatic 부울 마킹된 레벨

게임플레이 영향을 받지 않으며, 라이브 플레이와 리플레이 양쪽에 표시됩니다.

다이내믹 소스 레벨

퍼시스턴트 레벨 및 IsStatic 부울 변수가 false 설정된 서브레벨

라이브 게임플레이 영향을 받습니다. 리플레이 도중 숨겨지나, 게임플레이는 여전히 정상 실행됩니다.

다이내믹 복제 레벨

로드 시간에 다이내믹 소스 레벨에서 복제한 사본으로, 데디케이티드 서버나 에디터 모드에는 존재하지 않음

라이브 게임플레이 도중에는 숨겨집니다. 리플레이는 이 레벨에서 발생한 뒤 비워집니다.

Is Static 세팅은 창 메뉴의 레벨 뷰에서 서브레벨을 강조시킨 상태로 레벨 디테일 버튼을 클릭하여 찾을 수 있습니다.

Sublevel.png

그 레벨 디테일 창에서 Is Static 옵션을 찾을 수 있습니다. 이 창은 퍼시스턴트 레벨에 대해서는 비어있을 것이므로, 반드시 서브레벨을 선택하세요.

IsStatic.png

이 레벨 그룹은 레벨 스트리밍 프로세스의 일부이며, 리플레이 시스템에 국한된 것은 아닙니다.

이 시스템을 염두에 두고 다이내믹 소스 레벨에 대해 DemoNetDriver 를 하나, 다이내믹 복제 레벨에 대해서도 또 하나 만들 수 있습니다. 그러면 다이내믹 소스 레벨의 라이브 게임플레이를 녹화한 뒤, 다이내믹 복제 레벨에서 그 데이터를 재생할 수 있습니다. 리플레이 도중 다이내믹 소스 레벨은 숨기고 다이내믹 복제 레벨을 표시하는 것으로, 게임 플레이는 계속하면서 리플레이에 영향받지 않는 네트워크 업데이트를 받을 수 있습니다. 세 번째 스태틱 레벨 그룹은 언제든 활성화시켜 보이도록 할 수 있는데, 라이브 게임플레이에 영향받지 않는 스태틱 월드 지오메트리, 배경음, 파티클, 애니메이션 등이 저장되므로, 리플레이 프로세스에는 포함시킬 필요가 없습니다. 리플레이가 종료되면, 다이내믹 복제 레벨은 소멸되어 가비지 컬렉션 대상이 되고, 다이내믹 소스 레벨을 다시 시청할 수 있도록 만듭니다. 다이내믹 소스 레벨은 소멸이나 정지된 적 없이 숨기기만 했을 뿐이므로, 게임 리플레이 시청 도중에도 자연스렙게 진행될 것이며, 멈춤 현상 없이 바로 시청할 수 있습니다. 추가적으로 이 시스템에는 개발자가 레벨을 스태틱 마킹하여 리플레이 녹화 및 재생에서 제외되도록 하는 기능이 있어, 메모리와 시간을 절약할 수 있습니다.

HTTP 스트리머

HTTP Streamer (HTTP 스트리머)는 리플레이 데이터를 랜이나 인터넷 상의 다른 서버로 전송할 수 있습니다. 이는 라이브 스트리밍 경기 또는 경기 녹화 기록을 유지하여 언제든 볼 수 있도록 하는 데 좋습니다. 이 스트리머는 데디케이티드 서버 게임에 특히 유용한데, 서버가 항상 게임내 모든 곳에서 벌어지는 모든 일을 알고 있고, 리플레이 데이터 처리 작업에 들어가는 작업을 분산시켜 단일 서버에서 동시 호스팅할 수 있는 게임 수를 늘리려는 경우 좋습니다. 중재 또는 치트 감지 툴 역할을 하기에도 좋은데, 게임을 실행하는 쪽이 완벽히 제어하는 컴퓨터에서 데이터를 캡처할 수 있기 때문입니다.

HTTP 스트리머 사용법 세부사항

HTTP 스트리머는 HTTP 스트리머 REST API 를 통해 커스텀 작성 리플레이 서버와 통신을 합니다. GET 및 POST 메서드를 사용하여 바이너리 또는 JSON 포맷 스트링으로 데이터를 전송하는 것입니다. 별도의 리플레이 서버를 구성하기 위해서는, 먼저 URL 을 구성해야 합니다. 프로젝트의 DefaultEngine.Ini 파일에는 리플레이 서버의 URL 이 들어있는데, 있는 위치는 [HttpNetworkReplayStreaming] 섹션 아래 ServerURL 변수입니다. ServerURL 은 http://replay.yourgame.com/ 와 같은 포맷입니다. 마지막 / 는 중요하지 않은데, HTTP 스트리머는 그것이 URL 포맷을 변경할 것으로 가정하지 않을 것이기 때문입니다.

태그
언리얼 엔진 문서의 미래를 함께 만들어주세요! 더 나은 서비스를 제공할 수 있도록 문서 사용에 대한 피드백을 주세요.
설문조사에 참여해 주세요
취소