UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
StatsFile.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/AsyncWork.h"
6#include "Containers/Array.h"
8#include "Containers/Map.h"
9#include "Containers/Set.h"
12#include "CoreGlobals.h"
13#include "CoreTypes.h"
15#include "HAL/PlatformCrt.h"
16#include "HAL/ThreadSafeBool.h"
19#include "Logging/LogCategory.h"
20#include "Logging/LogMacros.h"
22#include "Misc/Build.h"
23#include "Misc/Compression.h"
25#include "Stats/Stats.h"
26#include "Stats/StatsCommon.h"
27#include "Stats/StatsData.h"
29#include "UObject/NameTypes.h"
30#include "UObject/UnrealNames.h"
31
33struct FStatsReadFile;
34
35#if STATS
36
38struct FStatsReadFile;
39
44{
45 MAGIC_NO_HEADER = 0x7E1B83C1,
46 MAGIC_NO_HEADER_SWAPPED = 0xC1831B7E,
47 NO_VERSION = 0,
48};
49
55{
56 MAGIC = 0x10293847,
57 MAGIC_SWAPPED = 0x47382910,
58 VERSION_2 = 2,
59 VERSION_3 = 3,
60
65 VERSION_4 = 4,
67
72 VERSION_5 = 5,
73
79 VERSION_6 = 6,
80
83};
84
86{
87 enum
88 {
92 MAX_COMPRESSED_SIZE = 1024 * 1024,
93
95 DUMMY_HEADER_SIZE = 1024,
96
98 END_OF_COMPRESSED_DATA = 0xE0F0DA4A,
99
101 NO_COMPRESSION = 0,
102 };
103};
104
105/*-----------------------------------------------------------------------------
106 FCompressedStatsData
107-----------------------------------------------------------------------------*/
108
111{
120 : SrcData( InSrcData )
121 , DestData( InDestData )
123 {}
124
128 static void WriteEndOfCompressedData( FArchive& Writer )
129 {
130 int32 Marker = EStatsFileConstants::END_OF_COMPRESSED_DATA;
131 check( Writer.IsSaving() );
132 Writer << Marker << Marker;
133 }
134
135protected:
138 {
139 if( Ar.IsSaving() )
140 {
141 Data.WriteCompressed( Ar );
142 }
143 else if( Ar.IsLoading() )
144 {
145 Data.ReadCompressed( Ar );
146 }
147 else
148 {
149 check( 0 );
150 }
151 return Ar;
152 }
153
155 void WriteCompressed( FArchive& Writer )
156 {
157 int32 UncompressedSize = SrcData.Num();
158 if( UncompressedSize > EStatsFileConstants::MAX_COMPRESSED_SIZE - EStatsFileConstants::DUMMY_HEADER_SIZE )
159 {
160 int32 DisabledCompressionSize = EStatsFileConstants::NO_COMPRESSION;
162 Writer.Serialize( SrcData.GetData(), UncompressedSize );
163 }
164 else
165 {
166 DestData.Reserve( EStatsFileConstants::MAX_COMPRESSED_SIZE );
167 int32 CompressedSize = (int32)DestData.GetAllocatedSize();
168
169 const bool bResult = FCompression::CompressMemory( NAME_Zlib, DestData.GetData(), CompressedSize, SrcData.GetData(), UncompressedSize );
170 check( bResult );
171 Writer << CompressedSize << UncompressedSize;
172 Writer.Serialize( DestData.GetData(), CompressedSize );
173 }
174 }
175
177 void ReadCompressed( FArchive& Reader )
178 {
179 int32 CompressedSize = 0;
181 Reader << CompressedSize << UncompressedSize;
182
183 if( CompressedSize == EStatsFileConstants::END_OF_COMPRESSED_DATA && UncompressedSize == EStatsFileConstants::END_OF_COMPRESSED_DATA )
184 {
186 }
187 // This chunk is not compressed.
188 else if( CompressedSize == 0 )
189 {
190 DestData.Reset( UncompressedSize );
191 DestData.AddUninitialized( UncompressedSize );
192 Reader.Serialize( DestData.GetData(), UncompressedSize );
193 }
194 else
195 {
196 SrcData.Reset( CompressedSize );
197 DestData.Reset( UncompressedSize );
198 SrcData.AddUninitialized( CompressedSize );
199 DestData.AddUninitialized( UncompressedSize );
200
201 Reader.Serialize( SrcData.GetData(), CompressedSize );
202 const bool bResult = FCompression::UncompressMemory(NAME_Zlib, DestData.GetData(), UncompressedSize, SrcData.GetData(), CompressedSize );
203 check( bResult );
204 }
205 }
206
207public:
211 const bool HasReachedEndOfCompressedData() const
212 {
214 }
215
216protected:
218 TArray<uint8>& SrcData;
219
221 TArray<uint8>& DestData;
222
225};
226
227/*-----------------------------------------------------------------------------
228 Stats file writing functionality
229-----------------------------------------------------------------------------*/
230
233{
236 : Version( 0 )
237 , FrameTableOffset( 0 )
238 , FNameTableOffset( 0 )
239 , NumFNames( 0 )
243 {}
244
250
252 FString PlatformName;
253
258
261
264
267
270
272 bool bRawStatsFile;
273
275 bool IsFinalized() const
276 {
278 }
279
281 bool HasCompressedData() const
282 {
283 return Version >= EStatMagicWithHeader::HAS_COMPRESSED_DATA_VER;
284 }
285
288 {
289 Ar << Header.Version;
290
291 if( Ar.IsSaving() )
292 {
293 Header.PlatformName.SerializeAsANSICharArray( Ar, 255 );
294 }
295 else if( Ar.IsLoading() )
296 {
297 Ar << Header.PlatformName;
298 }
299
300 Ar << Header.FrameTableOffset;
301
302 Ar << Header.FNameTableOffset
303 << Header.NumFNames;
304
305 Ar << Header.MetadataMessagesOffset
306 << Header.NumMetadataMessages;
307
308 Ar << Header.bRawStatsFile;
309
310 return Ar;
311 }
312};
313
314/*-----------------------------------------------------------------------------
315 FStatsFrameInfo
316-----------------------------------------------------------------------------*/
317
322struct FStatsFrameInfo
323{
326 : FrameFileOffset(0)
327 {}
328
332 {}
333
338 {}
339
342 {
343 Ar << Data.ThreadCycles << Data.FrameFileOffset;
344 return Ar;
345 }
346
349
352};
353
354/*-----------------------------------------------------------------------------
355 FStatsWriteStream
356-----------------------------------------------------------------------------*/
357
360{
361protected:
363 CORE_API void WriteMetadata( FArchive& Ar );
364
367
370 {
371 FName RawName = NameAndInfo.GetRawName();
372 bool bSendFName = !FNamesSent.Contains( RawName.GetComparisonIndex() );
373
375 Ar << ComparisonInt;
376
377 int32 Number = NameAndInfo.GetRawNumber();
378 if (bSendFName)
379 {
380 FNamesSent.Add( RawName.GetComparisonIndex() );
381 Number |= EStatMetaFlags::SendingFName << (EStatMetaFlags::Shift + EStatAllFields::StartShift);
382 }
383 Ar << Number;
384 if (bSendFName)
385 {
386 FString Name = RawName.ToString();
387 Ar << Name;
388 }
389 }
390
392 inline void WriteMessage( FArchive& Ar, FStatMessage const& Item )
393 {
394 WriteFName( Ar, Item.NameAndInfo );
395 switch (Item.NameAndInfo.GetField<EStatDataType>())
396 {
397 case EStatDataType::ST_int64:
398 {
399 int64 Payload = Item.GetValue_int64();
400 Ar << Payload;
401 break;
402 }
403
404 case EStatDataType::ST_double:
405 {
406 double Payload = Item.GetValue_double();
407 Ar << Payload;
408 break;
409 }
410
411 case EStatDataType::ST_FName:
412 {
413 WriteFName( Ar, FStatNameAndInfo( Item.GetValue_FName(), false ) );
414 break;
415 }
416
417 case EStatDataType::ST_Ptr:
418 {
419 uint64 Payload = Item.GetValue_Ptr();
420 Ar << Payload;
421 break;
422 }
423 }
424 }
425
428
430 TArray<uint8> OutData;
431};
432
433/*-----------------------------------------------------------------------------
434 IStatsWriteFile
435-----------------------------------------------------------------------------*/
436
439{
440 friend class FAsyncStatsWrite;
441
442protected:
444 FArchive* File;
445
447 FString ArchiveFilename;
448
451
454
456 TArray<uint8> CompressedData;
457
464
467
469 int64 FileSize;
470
472 double StartTime;
473
474protected:
477
478public:
480 virtual ~IStatsWriteFile()
481 {}
482
484 CORE_API void Start( const FString& InFilename );
485
487 CORE_API void Stop();
488
493
494protected:
496 virtual void SetDataDelegate( bool bSet ) = 0;
497
500 {};
501
502 bool IsValid() const
503 {
504 return !!File;
505 }
506
508 CORE_API void WriteHeader();
509
510protected:
512 CORE_API void Finalize();
513
515 CORE_API void WaitTask();
516
518 CORE_API void SendTask();
519};
520
522struct FStatsWriteFile : public IStatsWriteFile
523{
524 friend class FAsyncStatsWrite;
525
526protected:
529
530public:
533 {
534 Header.bRawStatsFile = false;
535 }
536
537protected:
538 CORE_API virtual void SetDataDelegate( bool bSet ) override;
539
540 CORE_API virtual void FinalizeSavingData( int64 FrameFileOffset ) override;
541
546 CORE_API void WriteFrame( int64 TargetFrame );
547};
548
551{
553
554public:
558 {
559 Header.bRawStatsFile = true;
560 }
561
562protected:
563 CORE_API virtual void SetDataDelegate( bool bSet ) override;
564
566
569};
570
571/*-----------------------------------------------------------------------------
572 Stats file reading functionality
573-----------------------------------------------------------------------------*/
574
577{
578 friend struct FStatsReadFile;
579
580public:
583 : MaxFrameSeen( 0 )
584 , MinFrameSeen( -1 )
585 {}
586
589
596
599
602
603protected:
606
609
612};
613
617struct FStatsReadStream
618{
619public:
622
625
628
630 bool ReadHeader( FArchive& Ar )
631 {
632 bool bStatWithHeader = false;
633
634 uint32 Magic = 0;
635 Ar << Magic;
636 if( Magic == EStatMagicNoHeader::MAGIC_NO_HEADER )
637 {
638
639 }
640 else if( Magic == EStatMagicNoHeader::MAGIC_NO_HEADER_SWAPPED )
641 {
642 Ar.SetByteSwapping( true );
643 }
644 else if( Magic == EStatMagicWithHeader::MAGIC )
645 {
646 bStatWithHeader = true;
647 }
648 else if( Magic == EStatMagicWithHeader::MAGIC_SWAPPED )
649 {
650 bStatWithHeader = true;
651 Ar.SetByteSwapping( true );
652 }
653 else
654 {
655 return false;
656 }
657
658 // We detected a header for a stats file, read it.
659 if( bStatWithHeader )
660 {
661 Ar << Header;
662 }
663
664 return true;
665 }
666
669 {
670 Ar << StatPacked.Frame;
671 Ar << StatPacked.ThreadId;
673 Ar << MyThreadType;
674 StatPacked.ThreadType = (EThreadType::Type)MyThreadType;
675
676 Ar << StatPacked.bBrokenCallstacks;
677 // We must handle stat messages in a different way.
678 int32 NumMessages = 0;
679 Ar << NumMessages;
680 StatPacked.StatMessages.Reserve( NumMessages );
681 for( int32 MessageIndex = 0; MessageIndex < NumMessages; ++MessageIndex )
682 {
683 new(StatPacked.StatMessages) FStatMessage( ReadMessage( Ar, true ) );
684 }
685 }
686
689 {
690 // If we read the whole FNames translation map, we don't want to add the FName again.
691 // This is a bit tricky, even if we have the FName translation map, we still need to read the FString.
692 // CAUTION!! This is considered to be thread safe in this case.
693 int32 Index = 0;
694 Ar << Index;
695 int32 Number = 0;
696 Ar << Number;
698
699 if( !bHasFNameMap )
700 {
701 if( Number & (EStatMetaFlags::SendingFName << (EStatMetaFlags::Shift + EStatAllFields::StartShift)) )
702 {
703 FString Name;
704 Ar << Name;
705
706 TheFName = FName( *Name );
707 FNamesIndexMap.Add( Index, TheFName.GetComparisonIndex() );
708 Number &= ~(EStatMetaFlags::SendingFName << (EStatMetaFlags::Shift + EStatAllFields::StartShift));
709 }
710 else
711 {
712 if( FNamesIndexMap.Contains( Index ) )
713 {
714 const FNameEntryId MyIndex = FNamesIndexMap.FindChecked( Index );
715 TheFName = FName( MyIndex, MyIndex, 0 );
716 }
717 else
718 {
719 TheFName = FName( TEXT( "Unknown FName" ) );
720 Number = 0;
721 UE_LOG( LogTemp, Warning, TEXT( "Missing FName Indexed: %d, %d" ), Index, Number );
722 }
723 }
724 }
725 else
726 {
727 if( Number & (EStatMetaFlags::SendingFName << (EStatMetaFlags::Shift + EStatAllFields::StartShift)) )
728 {
729 FString Name;
730 Ar << Name;
731 Number &= ~(EStatMetaFlags::SendingFName << (EStatMetaFlags::Shift + EStatAllFields::StartShift));
732 }
733 if( FNamesIndexMap.Contains( Index ) )
734 {
735 const FNameEntryId MyIndex = FNamesIndexMap.FindChecked( Index );
736 TheFName = FName( MyIndex, MyIndex, 0 );
737 }
738 else
739 {
740 TheFName = FName( TEXT( "Unknown FName" ) );
741 Number = 0;
742 UE_LOG( LogTemp, Warning, TEXT( "Missing FName Indexed: %d, %d" ), Index, Number );
743 }
744 }
745
747 Result.SetNumberDirect( Number );
748 return Result;
749 }
750
752 inline FStatMessage ReadMessage( FArchive& Ar, bool bHasFNameMap = false )
753 {
755 Result.Clear();
756 switch( Result.NameAndInfo.GetField<EStatDataType>() )
757 {
758 case EStatDataType::ST_int64:
759 {
760 int64 Payload = 0;
761 Ar << Payload;
762 Result.GetValue_int64() = Payload;
763 break;
764 }
765
766 case EStatDataType::ST_double:
767 {
768 double Payload = 0;
769 Ar << Payload;
770 Result.GetValue_double() = Payload;
771 break;
772 }
773
774 case EStatDataType::ST_FName:
775 {
776 FStatNameAndInfo Payload( ReadFName( Ar, bHasFNameMap ) );
777 Result.GetValue_FMinimalName() = NameToMinimalName( Payload.GetRawName() );
778 break;
779 }
780
781 case EStatDataType::ST_Ptr:
782 {
783 uint64 Payload = 0;
784 Ar << Payload;
785 Result.GetValue_Ptr() = Payload;
786 break;
787 }
788 }
789 return Result;
790 }
791
796 void ReadFramesOffsets( FArchive& Ar )
797 {
798 Ar.Seek( Header.FrameTableOffset );
799 Ar << FramesInfo;
800 }
801
807 {
808 // Read FNames.
809 Ar.Seek(Header.FNameTableOffset);
810 out_MetadataMessages.Reserve(Header.NumFNames);
811 for (uint64 Index = 0; Index < Header.NumFNames; Index++)
812 {
813 ReadFName(Ar, false);
814 }
815
816 // Read metadata messages.
817 Ar.Seek(Header.MetadataMessagesOffset);
818 out_MetadataMessages.Reserve(Header.NumMetadataMessages);
819 for (uint64 Index = 0; Index < Header.NumMetadataMessages; Index++)
820 {
821 out_MetadataMessages.Add(ReadMessage(Ar, false));
822 }
823 }
824};
825
828{
831 : TotalPacketsSize( 0 )
833 , MaximumPacketSize( 0 )
834 , TotalPacketsNum( 0 )
835 {}
836
839
842
845
848};
849
851enum class EStatsProcessingStage : int32
852{
854 SPS_Started = 0,
855
858
861
864
867
870
873
876
877};
878
882class FAsyncStatsFile
883{
886
887public:
890
892 void DoWork();
893
894 TStatId GetStatId() const
895 {
896 return TStatId();
897 }
898
900 bool CanAbandon()
901 {
902 return true;
903 }
904
906 void Abandon();
907};
908
909/*-----------------------------------------------------------------------------
910 Stats stack helpers
911-----------------------------------------------------------------------------*/
912
914struct FStackState
915{
919 {}
920
922 TArray<FName> Stack;
923
926
929};
930
931/*-----------------------------------------------------------------------------
932 FStatsReadFile
933-----------------------------------------------------------------------------*/
934
935template<typename T>
936struct FStatsReader
937{
939 static T* Create( const TCHAR* Filename )
940 {
941 T* StatsReadFile = new T( Filename );
942 const bool bValid = StatsReadFile->PrepareLoading();
943 if (!bValid)
944 {
945 delete StatsReadFile;
946 }
947 return bValid ? StatsReadFile : nullptr;
948 }
949};
950
952struct FStatsReadFile
953{
954 friend class FAsyncStatsFile;
955 friend struct FStatsReader<FStatsReadFile>;
956
958 static CORE_API const double NumSecondsBetweenUpdates;
959
960public:
963
966
969
975 int32 GetNumFrames() const
976 {
977 return NumFrames;
978 }
979
980protected:
983
984public:
986 CORE_API virtual ~FStatsReadFile();
987
988protected:
994
996 CORE_API void ReadStats();
997
999 CORE_API void ReadRawStats();
1000
1003
1005 CORE_API virtual void PreProcessStats();
1006
1008 CORE_API void ProcessStats();
1009
1012 {}
1013
1015 CORE_API virtual void PostProcessStats();
1016
1018 virtual void ProcessAdvanceFrameEventGameThreadOperation( const FStatMessage& Message, const FStackState& StackState )
1019 {}
1020
1022 virtual void ProcessAdvanceFrameEventRenderThreadOperation( const FStatMessage& Message, const FStackState& StackState )
1023 {}
1024
1026 virtual void ProcessCycleScopeStartOperation( const FStatMessage& Message, const FStackState& StackState )
1027 {}
1028
1030 virtual void ProcessCycleScopeEndOperation( const FStatMessage& Message, const FStackState& StackState )
1031 {}
1032
1034 virtual void ProcessSpecialMessageMarkerOperation( const FStatMessage& Message, const FStackState& StackState )
1035 {}
1036
1039 {
1041 {
1042 ProcessingStage.Set( int32( NewStage ) );
1043 StageProgress.Set( 0 );
1044 }
1045 }
1046
1047public:
1052 {
1053 return EStatsProcessingStage( ProcessingStage.GetValue() );
1054 }
1055
1059 const bool IsProcessingStopped() const
1060 {
1061 return GetProcessingStage() == EStatsProcessingStage::SPS_Stopped;
1062 }
1063
1067 FString GetProcessingStageAsString() const
1068 {
1070 FString Result;
1071 if (Stage== EStatsProcessingStage::SPS_Started)
1072 {
1073 Result = TEXT( "SPS_Started" );
1074 }
1075 else if (Stage == EStatsProcessingStage::SPS_ReadStats)
1076 {
1077 Result = TEXT( "SPS_ReadStats" );
1078 }
1079 else if (Stage == EStatsProcessingStage::SPS_PreProcessStats)
1080 {
1081 Result = TEXT( "SPS_PreProcessStats" );
1082 }
1083 else if (Stage == EStatsProcessingStage::SPS_ProcessStats)
1084 {
1085 Result = TEXT( "SPS_ProcessStats" );
1086 }
1087 else if (Stage == EStatsProcessingStage::SPS_PostProcessStats)
1088 {
1089 Result = TEXT( "SPS_PostProcessStats" );
1090 }
1091 else if (Stage == EStatsProcessingStage::SPS_Finished)
1092 {
1093 Result = TEXT( "SPS_Finished" );
1094 }
1095 else if (Stage == EStatsProcessingStage::SPS_Stopped)
1096 {
1097 Result = TEXT( "SPS_Stopped" );
1098 }
1099 else if (Stage == EStatsProcessingStage::SPS_Invalid)
1100 {
1101 Result = TEXT( "SPS_Invalid" );
1102 }
1103
1104 return Result;
1105 }
1106
1110 int32 GetStageProgress() const
1111 {
1112 return StageProgress.GetValue();
1113 }
1114
1118 bool IsBusy()
1119 {
1120 return AsyncWork != nullptr ? !AsyncWork->IsDone() : false;
1121 }
1122
1124 void RequestStop()
1125 {
1126 bShouldStopProcessing = true;
1127 }
1128
1129protected:
1134
1137
1141 CORE_API void UpdateProcessStageProgress( const int32 CurrentStatMessageIndex, const int32 FrameIndex, const int32 PacketIndex );
1142
1143protected:
1146
1149
1152
1154 FArchive* Reader;
1155
1157 FAsyncTask<FAsyncStatsFile>* AsyncWork;
1158
1161
1164
1167
1170
1172 FThreadSafeCounter ProcessingStage;
1173
1176
1179
1181 double LastUpdateTime;
1182
1184 const FString Filename;
1185
1187 int32 NumFrames;
1188
1190 const bool bRawStatsFile;
1191};
1192
1193/*-----------------------------------------------------------------------------
1194 Commands functionality
1195-----------------------------------------------------------------------------*/
1196
1198struct FCommandStatsFile
1199{
1201 static CORE_API FCommandStatsFile& Get();
1202
1205 : FirstFrame(-1)
1206 , CurrentStatsFile(nullptr)
1207 {}
1208
1210 void Start( const FString& Filename );
1211
1213 void StartRaw( const FString& Filename );
1214
1216 void Stop();
1217
1219 void TestLastSaved();
1220
1224 bool IsStatFileActive() const
1225 {
1226 return StatFileActiveCounter.GetValue() > 0;
1227 }
1228
1232 FText GetFileMetaDesc() const
1233 {
1234 if (IsStatFileActive() && CurrentStatsFile != nullptr)
1235 {
1236 return CurrentStatsFile->GetFileMetaDesc();
1237 }
1238 return FText();
1239 }
1240
1242 FString LastFileSaved;
1243
1244protected:
1247
1250
1253};
1254
1255
1256#endif // STATS
#define check(expr)
Definition AssertionMacros.h:314
void AsyncTask(ENamedThreads::Type Thread, TUniqueFunction< void()> Function)
Definition Async.cpp:54
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
FArchive & operator<<(FArchive &Ar, FEnvQueryDebugProfileData::FStep &Data)
Definition EnvQueryTypes.cpp:489
#define UE_LOG(CategoryName, Verbosity, Format,...)
Definition LogMacros.h:270
FORCEINLINE FMinimalName NameToMinimalName(FName InName)
Definition NameTypes.h:1602
@ Stop
Definition PrecomputedVolumetricLightmapStreaming.cpp:26
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
UE_FORCEINLINE_HINT bool IsLoading() const
Definition Archive.h:236
virtual CORE_API void Reset()
Definition Archive.cpp:151
void SetByteSwapping(bool Enabled)
Definition Archive.h:546
UE_FORCEINLINE_HINT bool IsSaving() const
Definition Archive.h:248
virtual void Seek(int64 InPos)
Definition Archive.h:1753
Definition AsyncWork.h:585
Definition IDelegateInstance.h:14
Definition NameTypes.h:617
FORCEINLINE FNameEntryId GetComparisonIndex() const
Definition NameTypes.h:626
Definition Text.h:385
Definition ThreadSafeBool.h:17
Definition ThreadSafeCounter.h:14
Definition Array.h:670
Definition UnrealString.h.inl:34
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
FORCEINLINE T * Get(const FObjectPtr &ObjectPtr)
Definition ObjectPtr.h:426
@ Start
Definition GeoEnum.h:100
State
Definition PacketHandler.h:88
void ReadHeader(FDeltaBatchHeader &OutBatchHeader, TConstArrayView< uint32 > InData)
Definition MorphTargetVertexCodec.cpp:460
Version
Definition NNEModelData.cpp:15
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
bool WriteCompressed(const double Value, FArchive &Ar)
Definition ModuleInput.cpp:43
bool ReadCompressed(double &Value, FArchive &Ar)
Definition ModuleInput.cpp:50
@ false
Definition radaudio_common.h:23
#define MAGIC(SHIFT)
U16 Index
Definition radfft.cpp:71
static CORE_API bool CompressMemory(FName FormatName, void *CompressedBuffer, int64 &CompressedSize, const void *UncompressedBuffer, int64 UncompressedSize, ECompressionFlags Flags=COMPRESS_NoFlags, uintptr_t CompressionData=0)
Definition Compression.cpp:828
static CORE_API bool UncompressMemory(FName FormatName, void *UncompressedBuffer, int64 UncompressedSize, const void *CompressedBuffer, int64 CompressedSize, ECompressionFlags Flags=COMPRESS_NoFlags, uintptr_t CompressionData=0)
Definition Compression.cpp:915
Definition NameTypes.h:69
constexpr uint32 ToUnstableInt() const
Definition NameTypes.h:111
Definition LightweightStats.h:416