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로 조절
- Checkpoint 사이 기간을 늘리면 Replay를 앞뒤로 문질러 이동하는 작업이 느려진다.
- 대신 Replay 크기는 줄어든다.
녹화 중 임시 정지
- bPauseRecording 변수를 true로 설정해 Demo 녹화 중 녹화를 임시 정지할 수 있다.
대체 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
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