UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
Stats.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#if (defined(__AUTORTFM) && __AUTORTFM)
6
7#include "Toggles.h"
8#include "Utils.h"
9
10#include <cstring>
11
12namespace AutoRTFM
13{
14
15enum class EStatsKind : uint8_t
16{
17 Transaction = 0,
18 Commit,
19 Abort,
39 Total
40};
41
42template<EStatsKind Kind> constexpr bool IsStatsKindNoArgs()
43{
44 switch (Kind)
45 {
46 default:
47 return false;
48 case EStatsKind::Transaction:
49 case EStatsKind::Commit:
50 case EStatsKind::Abort:
51 case EStatsKind::HitSetHit:
52 case EStatsKind::HitSetMiss:
53 case EStatsKind::HitSetSkippedBecauseOfStackLocalMemory:
54 case EStatsKind::NewMemoryTrackerHit:
55 case EStatsKind::NewMemoryTrackerMiss:
56 return true;
57 }
58}
59
60template<EStatsKind Kind> constexpr bool IsStatsKindOneArg()
61{
62 switch (Kind)
63 {
64 default:
65 return false;
66 case EStatsKind::AverageTransactionDepth:
67 case EStatsKind::MaximumTransactionDepth:
68 case EStatsKind::AverageWriteLogEntries:
69 case EStatsKind::MaximumWriteLogEntries:
70 case EStatsKind::AverageWriteLogBytes:
71 case EStatsKind::MaximumWriteLogBytes:
72 case EStatsKind::AverageCommitTasks:
73 case EStatsKind::MaximumCommitTasks:
74 case EStatsKind::AveragePreAbortTasks:
75 case EStatsKind::MaximumPreAbortTasks:
76 case EStatsKind::AverageAbortTasks:
77 case EStatsKind::MaximumAbortTasks:
78 case EStatsKind::AverageHitSetSize:
79 case EStatsKind::AverageHitSetCapacity:
80 return true;
81 }
82}
83
84template<EStatsKind Kind> constexpr bool IsStatsKindAverage()
85{
86 switch (Kind)
87 {
88 default:
89 return false;
90 case EStatsKind::AverageTransactionDepth:
91 case EStatsKind::AverageWriteLogEntries:
92 case EStatsKind::AverageWriteLogBytes:
93 case EStatsKind::AverageCommitTasks:
94 case EStatsKind::AveragePreAbortTasks:
95 case EStatsKind::AverageAbortTasks:
96 case EStatsKind::AverageHitSetSize:
97 case EStatsKind::AverageHitSetCapacity:
98 return true;
99 }
100}
101
102template<EStatsKind Kind> constexpr bool IsStatsKindMaximum()
103{
104 switch (Kind)
105 {
106 default:
107 return false;
108 case EStatsKind::MaximumTransactionDepth:
109 case EStatsKind::MaximumWriteLogEntries:
110 case EStatsKind::MaximumWriteLogBytes:
111 case EStatsKind::MaximumCommitTasks:
112 case EStatsKind::MaximumAbortTasks:
113 return true;
114 }
115}
116
117struct FStats final
118{
119 FStats()
120 {
121 memset(Datas, 0, sizeof(Datas));
122 }
123
124 ~FStats()
125 {
126 if constexpr (bCollectStats)
127 {
128 Report();
129 }
130 }
131
132 void Report() const;
133
134 template<EStatsKind Kind> UE_AUTORTFM_FORCEINLINE void Collect()
135 {
136 static_assert(IsStatsKindNoArgs<Kind>());
137
138 if constexpr (bCollectStats)
139 {
140 Datas[static_cast<size_t>(Kind)] += 1;
141 }
142 }
143
144 template<EStatsKind Kind> UE_AUTORTFM_FORCEINLINE void Collect(uint64_t Data)
145 {
146 static_assert(IsStatsKindOneArg<Kind>());
147
148 if constexpr (bCollectStats)
149 {
150 if constexpr (IsStatsKindAverage<Kind>())
151 {
152 Datas[static_cast<size_t>(Kind)] += Data;
153 }
154 else if constexpr (IsStatsKindMaximum<Kind>())
155 {
156 uint64_t* const Ptr = &Datas[static_cast<size_t>(Kind)];
157 *Ptr = std::max<uint64_t>(*Ptr, Data);
158 }
159 }
160 }
161
162private:
163 uint64_t Datas[static_cast<size_t>(EStatsKind::Total)];
164
165 template<EStatsKind Kind> void Report(const uint64_t Data) const;
166};
167
168extern FStats Stats;
169
170template<typename T, bool bActive = bCollectStats> struct TStatStorage;
171
172template<typename T> struct TStatStorage<T, false> final
173{
174 UE_AUTORTFM_FORCEINLINE TStatStorage(const T) { /* ignored */ }
175 UE_AUTORTFM_FORCEINLINE void operator=(const T) { /* ignored */ }
176 UE_AUTORTFM_FORCEINLINE void operator+=(const T) { /* ignored */ }
177 UE_AUTORTFM_FORCEINLINE operator T() const { return T(0); }
178};
179
180template<typename T> struct TStatStorage<T, true> final
181{
182 UE_AUTORTFM_FORCEINLINE TStatStorage(const T t) : Data(t) {}
183 UE_AUTORTFM_FORCEINLINE void operator=(const T t) { Data = t; }
184 UE_AUTORTFM_FORCEINLINE void operator+=(const T t) { Data += t; }
185 UE_AUTORTFM_FORCEINLINE operator T() const { return Data; }
186private:
187 T Data;
188};
189
190} // namespace AutoRTFM
191
192#endif // (defined(__AUTORTFM) && __AUTORTFM)
#define UE_AUTORTFM_FORCEINLINE
Definition AutoRTFMDefines.h:171
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
return true
Definition ExternalRpcRegistry.cpp:601
UE::Stats::FStats FStats
Definition StatsSystem.h:56
FStringBuilderBase & operator+=(FStringBuilderBase &Builder, ANSICHAR Char)
Definition StringBuilder.h:582
Definition API.cpp:57
GeometryCollection::Facades::FMuscleActivationData Data
Definition MuscleActivationConstraints.h:15
@ false
Definition radaudio_common.h:23
Definition StatsSystem.h:13