56 void SetPlaybackNetworkVersions(
FArchive& Ar);
67 bool ReadPlaybackDemoHeader(FString& Error);
76 bool HasLevelStreamingFixes()
const
78 return bHasLevelStreamingFixes;
81 bool HasDeltaCheckpoints()
const
83 return bHasDeltaCheckpoints;
86 bool HasGameSpecificFrameData()
const
88 return bHasGameSpecificFrameData;
91 FGuid GetPlaybackGuid()
const
93 return PlaybackDemoHeader.
Guid;
98 void TickRecording(
float DeltaSeconds,
UNetConnection* Connection);
102 bool ShouldSaveCheckpoint()
const;
105 float GetCheckpointSaveMaxMSPerFrame()
const;
113 static float GetClampedDeltaSeconds(
UWorld* World,
const float DeltaSeconds);
115 uint32 GetDemoCurrentTimeInMS()
const {
return (
uint32)((
double)DemoCurrentTime * 1000); }
116 uint32 GetLastCheckpointTimeInMS()
const {
return (
uint32)((
double)LastCheckpointTime * 1000); }
120 void AddOrUpdateEvent(
const FString&
Name,
const FString&
Group,
const FString& Meta,
const TArray<uint8>& Data);
124 void RequestCheckpoint();
133 void OnLevelRemovedFromWorld(
ULevel* Level,
UWorld* World);
141 enum class EReadPacketState
148 enum class EReadPacketMode
165 static const EReadPacketState ReadPacket(
FArchive& Archive,
TArray<uint8>& OutBuffer,
const EReadPacketMode Mode);
190 struct FExternalDataWrapper
200 void LoadExternalData(
FArchive& Ar,
const float TimeSeconds);
209 FString ActiveReplayName;
219 int32 CurrentLevelIndex;
225 float DemoCurrentTime;
231 double LastCheckpointTime;
234 float LatestReadFrameTime;
236 bool bWasStartRecordingSuccessful;
237 bool bIsWaitingForStream;
238 bool bIsLoadingCheckpoint;
241 bool bHasLevelStreamingFixes;
244 bool bHasDeltaCheckpoints;
247 bool bHasGameSpecificFrameData;
250 bool bPauseRecording;
252 bool bRecordMapChanges;
254 float CheckpointSaveMaxMSPerFrame;
259 enum class ECheckpointSaveState
262 ProcessCheckpointActors,
263 SerializeDeletedStartupActors,
264 SerializeDeltaDynamicDestroyed,
265 SerializeDeltaClosedChannels,
268 SerializeNetFieldExportGroupMap,
269 SerializeDemoFrameFromQueuedDemoPackets,
273 struct FCheckpointStepHelper
275 FCheckpointStepHelper() =
delete;
286 ~FCheckpointStepHelper()
289 const double TotalTimeInMS = (EndTime - CheckpointStartTime) * 1000.0;
290 const double StepTimeInMS = (EndTime - StartTime) * 1000.0;
294 switch (CheckpointState)
296 case ECheckpointSaveState::ProcessCheckpointActors:
299 case ECheckpointSaveState::SerializeDeletedStartupActors:
302 case ECheckpointSaveState::SerializeDeltaDynamicDestroyed:
305 case ECheckpointSaveState::SerializeDeltaClosedChannels:
308 case ECheckpointSaveState::SerializeGuidCache:
312 ensureMsgf(
false,
TEXT(
"FCheckpointStepHelper: Unsupported checkpoint state: %d"), CheckpointState);
320 ECheckpointSaveState CheckpointState;
321 double StartTime = 0.0;
322 double CheckpointStartTime = 0.0;
323 int32* CurrentIndex =
nullptr;
324 int32 TotalCount = 0;
328 struct FPendingCheckPointActor
334 struct FNetGuidCacheItem
341 struct FCheckpointSaveStateContext
343 FCheckpointSaveStateContext()
344 : CheckpointSaveState(ECheckpointSaveState::
Idle)
345 , TotalCheckpointSaveTimeSeconds(0.0)
346 , TotalCheckpointReplicationTimeSeconds(0.0)
347 , bWriteCheckpointOffset(
false)
348 , TotalCheckpointSaveFrames(0)
349 , TotalCheckpointActors(0)
350 , CheckpointOffset(0)
352 , NextAmortizedItem(0)
353 , NumNetGuidsForRecording(0)
354 , NetGuidsCountPos(0)
357 ECheckpointSaveState CheckpointSaveState;
361 double TotalCheckpointSaveTimeSeconds;
362 double TotalCheckpointReplicationTimeSeconds;
363 bool bWriteCheckpointOffset;
364 int32 TotalCheckpointSaveFrames;
365 int32 TotalCheckpointActors;
373 int32 NextAmortizedItem;
374 int32 NumNetGuidsForRecording;
381 void CountBytes(
FArchive& Ar)
const;
384 FCheckpointSaveStateContext CheckpointSaveContext;
418 FLevelStatus(
const FString& LevelPackageName) :
419 LevelName(LevelPackageName),
440 LevelName.CountBytes(Ar);
465 void ResetLevelMap();
466 void ClearLevelMap();
472 uint32 NumLevelsAddedThisFrame;
478 bool bPendingCheckpointRequest;
484 void ResetLevelStatuses();
485 void ClearLevelStreamingState()
487 AllLevelStatuses.
Empty();
488 LevelStatusesByName.Empty();
489 SeenLevelStatuses.
Empty();
490 LevelsPendingFastForward.Empty();
491 NumLevelsAddedThisFrame = 0;
492 LevelStatusIndexByLevel.Reset();
495 FLevelStatus& FindOrAddLevelStatus(
const ULevel& Level)
505 FLevelStatus&
LevelStatus = FindOrAddLevelStatus(GetLevelPackageName(Level));
506 LevelStatusIndexByLevel.Add(&Level,
LevelStatus.LevelIndex);
511 FLevelStatus& FindOrAddLevelStatus(
const FString& LevelPackageName)
513 return FindOrAddLevelStatus(FString(LevelPackageName));
516 FLevelStatus& FindOrAddLevelStatus(FString&& LevelPackageName)
527 NumLevelsAddedThisFrame++;
529 return AllLevelStatuses[
Index];
532 FLevelStatus& GetLevelStatus(
const int32 SeenLevelIndex)
534 return AllLevelStatuses[SeenLevelStatuses[SeenLevelIndex - 1]];
537 FLevelStatus& GetLevelStatus(
const FString& LevelPackageName)
539 return AllLevelStatuses[LevelStatusesByName[LevelPackageName]];
558 ECheckpointSaveState GetCheckpointSaveState()
const {
return CheckpointSaveContext.CheckpointSaveState; }
566 static constexpr int32 MAX_DEMO_READ_WRITE_BUFFER = 1024 * 2;
567 static constexpr int32 MAX_DEMO_STRING_SERIALIZATION_SIZE = 16 * 1024 * 1024;