https://dev.epicgames.com/documentation/ko-kr/unreal-engine/demonetdriver-and-streamers-in-unreal-engine?application_version=5.3

DemoNetDeriver

  • Streamer를 사용해 Replay 재생에 필요한 정보를 추출/기록
  • 시청 방식에 따라 Engine에 포함된 다양한 Streamer를 DemoNetDriver에 붙일 수 있음.

Streamer 변경

  • ReplayStreamerOverride 옵션에서 다른 Streamer Factory Module을 변경해 덮어쓸 수 있다.
    • InMemoryNetworkReplayStreaming
    • HttpNetworkReplayStreaming
  • 기본값인 LocalFileNetworkReplayStreaming은
    Default.ini의 NetworkReplayStreaming 섹션의 DefaultFactoryName 변수를 설정해 변경 가능
  • InitBase를 호출하고 적당한 URL 인수를 파라미터로 제공하는 것으로도 변경 가능
  • GameMode는 Replay를 보기 위해 ReplaySpectatorPlayerControllerClass에 지정된 Class를 사용한다.

시간 비용 분산

  • 콘솔 변수 demo.CheckpointSaveMaxMSPerFrame 값을 양수로 설정해
    리플레이 데이터 녹화에 필요한 시간 비용 분산할 수 있다.
  • Frame당 시간 제한 만료 전 Replay에 녹화되지 않은 Actor는 대기열에 등록 되었다가 다음 Frame에 녹화된다.
  • Checkpoint 녹화 및 Take에 드는 시간에 상한선을 두어 게임이 멈추는 현상을 방지하는데 도움이 된다.
  • Actor에 대한 Data에 들어있는 Checkpoint를 여러 Frame걸쳐 찍기 때문에
    재생 도중 약간의 시각적 오류가 발생할 수 있다.
  • 이 기능은 주로 게임에서 Checkpoint 녹화를 위해 지정된 시간 제한보다 오래 걸렸을 때에만 발동한다.
    • 저사양 머신 또는 퍼포먼스를 많이 요하는 게임에서 주로 적용된다는 의미이다.

녹화 우선순위 지정

  • 다음 조건을 만족하면 Replay에 저장되는 Actor의 녹화 순서를 지정 할 수 있다.
    • bPriotizeActors 옵션을 활성화
    • GetReplayPriority 함수를 Implement
  • MaxDesiredRecordTimeMS를 통한 분산 녹화와 함께 사용하면 더 효과적이다.

Checkpoint 녹화 빈도

  • 콘솔 변수 demo.CVarCheckpointUploadDelayInSeconds로 조절
    • 기본값: 30초
  • Checkpoint 사이 기간을 늘리면 Replay를 앞뒤로 문질러 이동하는 작업이 느려진다.
  • 대신 Replay 크기는 줄어든다.

녹화 중 임시 정지

  • bPauseRecording 변수를 true로 설정해 Demo 녹화 중 녹화를 임시 정지할 수 있다.
    • false로 설정하면 녹화가 재게된다.

대체 PlayerController 생성

  • SerViewerOverride를 사용하면 DemoNetDriver가 녹화 목적으로 사용되는 대체 PlayerController를 생성한다.
    • 이 Playercontroller는 Actor의 Network Relevancy, Curling, Priority 결정 방식을 변경할 수 있다.
  • 이 기능은 GamePlay에서 멀리서 일어나는 일을 알 수 없지만, Replay에서는 모든 것을 볼 수 있도록 할 때 좋다.

Slate와의 병렬 처리

  • Slate와 병렬 처리를 위해 아래 콘솔 변수가 0이 아닌 값으로 적용되어야 한다.
    • tick.DoAsyncEndOfFrameTasks
    • demo.ClientRecordAsyncEndOfFrame

주의점

  • Replay 생성 Actor는 Live Gameplay Actor와 마찬가지로 함수 호출을 한다.
  • 이는 Live Actor처럼 행동해 Replay Data를 최소화할 수도 있다.
  • 하지만 공유 Object에 영향을 주는 함수 호출이 Replay Actor에서도
    사용 가능해 원하지 않는 방식으로 Game의 상태에 영향을 줄 수 있다.
    • GameInstance, GameState, GameMode
  • 특히 Memory Streamer가 그러한데, 현재 Play 중인 Live GamePlay를 바로 시청하는 경우이다.
  • Actor에 영향을 주지 않도록 하는 보호 장치로,
    Actor가 Live인지 Replay Level의 일부인지 확인한 후 작업을 처리하는 것을 권장한다.
  • 이러한 문제는 거의 Game에서만 발생할 것이라서 각 Project에서 건 by 건으로 처리해줘야 한다.
  • 이러한 문제의 대표적인 예시로 Replay 도중 Player의 상태가 변하지만 점수가 변하지 않는 것이다.

Replay Data Format

  • Data 측면에서 Replay에는 3가지 게임 상태 정보와 더불어 약간의 Text Data가 추가로 저장된다.

기준 Data

  • Game World의 시작 상태를 설명하는 시작 부분

Checkpoint

  • World에 가해지는 전체 변경 사항의 Snapshot 역할을 한다.
  • 정기적인 사용지 지정 간격으로 나타난다.

점증적 변화량

  • Checkpoint 사이를 채워주는 요소
    • World의 개별 Object들이 각자의 점증적 변화량을 가진다.
  • 이를 통해 Game 내 어느 순간도 Engine에서 빠르고 정확하게 재구성 할 수 있다.

Text Data

  • 다음 2가지로 구성되어 있다.
    • Player가 보는 목록을 만드는데 사용할 수 있는 표시명
    • Game 목록의 검색 또는 필터링에 사용할 수 있는 Custom Text Tag
      • HTTP Streamer 전용

Replay 방식

  • World를 기준 Data로 초기화
  • 선택한 시간 이전의 Checkpoint가 구현된 상태로 변경
  • 가장 최근 Checkpoint 이후 지정된 시간 직전까지의 점증적 변화량 적용

Local File Streamer

  • DemoNetDriver가 가진 기본 Streamer 타입
  • Host Machine의 Replay Data를 로컬 저장장치의 단일 파일에 비동기 기록한다.
    • 때문에 Single Player Game 및 Replay를 로컬에서 재생하는 게임에 적합하다.
  • 저장된 Replay 배포와 관리가 쉽다.
  • 비동기 기록 기능이 있어 Console처럼 HDD 속도가 낮은 System의 Performance가 향상된다.
  • Replay Data File은 Project/Saved/Demos/ 폴더에 저장된다.
  • 확장자는 ".replay"이다.

SaveGame Replay Streamer

  • Replay를 SaveGame Slot을 선택해 저장하는 기능이 추가된 특수한 Local File Streamer
  • Client에 Replay를 저장한 뒤, 다음 Platform의 SaveGame 로드 용 Interface를 통해 읽을 수 있다. 
    •  SaveGame System 없이 Replay를 저장/보관/로드가 가능하다.
  • 주 목적은 SaveGame Slot에 복사되지 않은 Replay 식별/복사/재생/삭제 등의 작업을 Local File과 SaveGame Slot 양쪽에서 할 수 있는 보조 API 활용이다.
  • Console 게임에 적합함.

Null Streamer

  • Replay Data를 Local 디스크에 직접 작성한다.
    • Local 녹화 제작, Single Player Game에 좋다.
  • GamePlay Trailer나 Cut-Scene 영상 제작, Tutorial, TimeAttack Video 시청 및 공유를 할 수 있게 해준다.
  • 4.20 버전 이후로 Deprecated 되었지만 예전 Replay를 재생할 수 있도록 하위 호환성을 유지하고 있다.

Memory Streamer

  • 사용자가 지정할 수 있는 실행 길이의 Replay Data를 Client Machine의 Memory에 저장
  • 최근의 극적인 순간에 대한 즉석 Replay에 최적화 되어 있다. 
    • Sports Game의 즉석 Replay
    • Shooting Game의 Kill Cam
    • Action Game에서의 최종 보스 처치 장면

사용법 세부사항

  • Memory Streamer는 하나의 Session 도중 녹화와 재생, Gameplay가 재개되도록 되어 있다는 점에서 특별하다.
    • Player가 Replay를 시청하는 도중 LiveGame은 모습도 소리도 업싱 계속 진행시키고,
      Replay가 끝나면 매끄럽게 Game이 이어지도록 할 수 있다.
  • 로드 시간에 Engine은 Level을 Static, Dynamic Source, Dynamic Duplicate으로 모은다.
    • 이를 그룹을 통해 Live Gameplay 및 Replya System과의 Level 상호작용 방식이 다음과 같이 정해진다.

Static Level

  • Persistant Level이 아니면서 IsStatic이 마킹 된 Level
  • 작동 시 Gameplay 영향을 받지 않으며, Live Play와 Replay 양쪽에 모두 표시된다.

Dynamic Source Level

  • Persistant Level이면서 IsStatic이 마킹되지 않은 Sublevel
  • Live Gameplay의 영향을 받는다.
  • Replay 도중에는 숨겨지지만, Gameplay에는 여전히 정상 실행된다.

Dynamic Duplicate Level

  • 로드 시간에 Dynamic Source Level에서 복제한 사본
    • Dedicated Server나 Editor Mode에는 존재하지 않음
  • Live Gameplay 도중에는 숨겨진다.
  • Replay는 이 Level에서 발생한 뒤 비워진다.

효율적인 사용법

  • Dynamic Source Level에 대해 DemoNetDriver를 하나, Dynamic Duplicate Level에 대해 또 하나 만들 수 있다.
    • 이 경우 Dynamic Source Level의 Live Gameplay를 녹화한 뒤, Dynamic Duplicate Level에서 재생할 수 있다.
    • Replay 도중 Dynamic Source Level은 숨기고 Dynamic Duplicate Level을 표시하면
      Gameplay는 계속하면서 REplay에 영향받지 않는 Network Update를 받을 수 있다.
  • Static Level 그룹은 언제든 활성화시켜 보이도록 할 수 있다.
  • Live Gameplay에 영향을 받지 않은 것들이 저장 되므로 Replay Process에는 포함시킬 필요가 없다.
    • Static World Geometry
    • BGM
    • Particle
    • Animation
  • Dynamic Source Level은 소멸이나 정지된 적 없이 숨기기만 했을 뿐이다.
    • 그렇기에 Gameplay Replay 시청 도중에도 자연스럽게 진행되고,
      Dynamic Source Level을 다시 시청할 수 있도록 만들 수 있다.
  • 더불어 이 System에는 개발자가 Level을 Static 마킹하여 REplay 녹화 및 재생에서 제외도도록 하는 기능이 있다.
    • 결과적으로 Memory와 시간을 절약할 수 있다.

HTTP Streamer

  • Replay Data를 LAN이나 인터넷을 통해 다른 Machine에 전송할 때 사용
  • 다음 경우에 유용함
    • Dedicated Server Game
      • Server가 항상 Game 내 모든 곳에서 벌어지는 일을 알고 있음.
      • Replay Data 처리 작업에 들어가는 작업을 분산시켜
        단일 서버에서 동시 Hosting 할 수 있는 Game 수를 늘리려는 경우에 좋음.
    • 많은 수의 시청자에게 Live Streaming 방송을 하면서도 반응 속도는 좋게 유지해야 하는 경우
    • Live Streaming 경기나 경기 녹화 기능을 유지하여 언제든지 볼 수 있도록 할 때
  • Game을 실행하는 쪽이 완벽히 제어하는 Computer에서 Data를 캡쳐할 수 있어 치트 감지 툴 역할을 하기 좋다.

사용법 세부사항

  • HTTP Streamer REST API를 통해 Custom Replay Server와 통신한다.
    • GET 및 POST Method를 사용해 Binary나 JSON Format String으로 Data 전송
    • Server를 구성하기 위해서는 URL을 구성해야 한다.

Custom Replay Server URL 구성법

  • Project의 DefaultEngine.ini 파일의 [HttpNetworkReplayStreaming] 섹션 아래 ServerURL 변수
  • http://replay/yourgame.com/ << 이와같은 포맷
  • 마지막 /는 있으나 없으나 문제 없다

HTTP Streamer REST API

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/http-streamer-rest-api-for-unreal-engine?application_version=5.3

'UE5 > Network' 카테고리의 다른 글

[Network] Property Replication  (1) 2024.06.28
[Network] Network Property  (0) 2024.06.25
[Network] Network Driver  (0) 2024.06.18
[Network] Beacon  (0) 2024.06.17
[Network] Replication Graph  (1) 2024.06.13

+ Recent posts