UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetStatsContext.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "HAL/Platform.h"
11
12namespace UE::Net::Private
13{
14
16{
29
31 {
33 {
34 Time += Other.Time;
35 Bits += Other.Bits;
36 Count += Other.Count;
37 }
41 };
42
44 void Reset()
45 {
46 *this = FNetTypeStatsData();
47 }
48
51 {
53 {
55 }
56 }
57
59};
60
62{
63public:
68
70
71 // Helper to lookup TypeStatsIndex from object, we currently store the NetTypeStatsIndex in the ReplicationProtocol but nothing prevents us from storing it elsewhere
72 // Depending on config subobjects report their stats with the root, for those cases we do not bump the count of root objects.
73 // returns the FNetTypeStatsData associated with the protocol used by the object references by the InternalIndex
77
78 bool CanAcquire() const
79 {
80 return !bIsAcquiredByTask;
81 }
82
83protected:
84 void Acquire()
85 {
86 check(!bIsAcquiredByTask);
87 bIsAcquiredByTask = true;
88 }
89 void Release()
90 {
91 check(bIsAcquiredByTask);
92 bIsAcquiredByTask = false;
93 }
94
95private:
96 friend class FNetTypeStats;
97
98 const FNetRefHandleManager* NetRefHandleManager = nullptr;
99 TArray<FNetTypeStatsData> TypeStatsData;
100 bool bShouldIncludeSubObjectWithRoot = false;
101 bool bIsAcquiredByTask = false;//True if actively being used by a parallel task and cannot be acquired by another one
102};
103
105{
106public:
108 : FNetTimer(InStatsContext != nullptr)
109 , NetStatsContext(InStatsContext)
110 {
111 }
112
113 // If we have a context, this timer is enabled
114 FNetStatsContext* GetNetStatsContext() const { return NetStatsContext; }
115
116private:
117 FNetStatsContext* NetStatsContext;
118};
119
121{
123 if (bTreatAsRoot)
124 {
125 TypeStatsIndex = ObjectData.Protocol ? ObjectData.Protocol->TypeStatsIndex : FNetTypeStats::OOBChannelTypeStatsIndex;
126 }
127 else
128 {
129 const FNetRefHandleManager::FReplicatedObjectData& RootObjectData = Context.NetRefHandleManager->GetReplicatedObjectDataNoCheck(ObjectData.SubObjectRootIndex);
131 }
132
133 return Context.TypeStatsData[TypeStatsIndex];
134}
135
137{
138 const FNetRefHandleManager::FReplicatedObjectData& ObjectData = Context.NetRefHandleManager->GetReplicatedObjectDataNoCheck(InternalIndex);
139 const bool bTreatAsRoot = !Context.bShouldIncludeSubObjectWithRoot || !ObjectData.IsSubObject();
140 return GetTypeStatsData(Context, ObjectData, bTreatAsRoot);
141}
142
143
145{
146 const FNetRefHandleManager::FReplicatedObjectData& ObjectData = Context.NetRefHandleManager->GetReplicatedObjectDataNoCheck(InternalIndex);
147 const bool bTreatAsRoot = !Context.bShouldIncludeSubObjectWithRoot || !ObjectData.IsSubObject();
148 OutUpdateCount = bTreatAsRoot ? 1U : 0U;
149 return GetTypeStatsData(Context, ObjectData, bTreatAsRoot);
150}
151
152
154{
155 TypeStatsData.SetNum(NumTypeStats);
156 for (FNetTypeStatsData& TypeStats : TypeStatsData)
157 {
158 TypeStats.Reset();
159 }
160}
161
162}
163
164// Wrap usage of stats in macros so we can compile it out
165#if UE_NET_IRIS_CSV_STATS
166
167#define UE_NET_IRIS_STATS_ADD_TIME_AND_COUNT_FOR_OBJECT(Timer, StatName, ObjectIndex) \
168 do { \
169 if (UE::Net::Private::FNetStatsContext* LocalNetStatsContext = Timer.GetNetStatsContext()) \
170 { \
171 uint32 CountIncrement = 0U; \
172 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*LocalNetStatsContext, ObjectIndex, CountIncrement); \
173 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Time += Timer.GetCyclesSinceStart(); \
174 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Count += CountIncrement; \
175 } \
176 } while (0)
177
178#define UE_NET_IRIS_STATS_ADD_TIME_AND_COUNT_FOR_OBJECT_AS_WASTE(Timer, StatName, ObjectIndex) \
179 do { \
180 if (UE::Net::Private::FNetStatsContext* LocalNetStatsContext = Timer.GetNetStatsContext()) \
181 { \
182 const uint64 DeltaTimeForStat = Timer.GetCyclesSinceStart(); \
183 uint32 CountIncrement = 0U; \
184 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*LocalNetStatsContext, ObjectIndex, CountIncrement); \
185 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Time += DeltaTimeForStat; \
186 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Count += CountIncrement; \
187 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName##Waste].Time += DeltaTimeForStat; \
188 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName##Waste].Count += CountIncrement; \
189 } \
190 } while (0)
191
192#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_AND_COUNT_FOR_OBJECT(NetStatsContext, BitCount, StatName, ObjectIndex) \
193 do { \
194 if (NetStatsContext) \
195 { \
196 uint32 CountIncrement = 0U; \
197 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*NetStatsContext, ObjectIndex, CountIncrement); \
198 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Bits += BitCount; \
199 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Count += CountIncrement; \
200 } \
201 } while (0)
202
203#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_FOR_OBJECT(NetStatsContext, BitCount, StatName, ObjectIndex) \
204 do { \
205 if (NetStatsContext) \
206 { \
207 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*NetStatsContext, ObjectIndex); \
208 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Bits += BitCount; \
209 } \
210 } while (0)
211
212#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_FOR_OBJECT_AS_WASTE(NetStatsContext, BitCount, StatName, ObjectIndex) \
213 do { \
214 if (NetStatsContext) \
215 { \
216 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*NetStatsContext, ObjectIndex); \
217 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Bits += BitCount; \
218 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName##Waste].Bits += BitCount; \
219 } \
220 } while (0)
221
222// Increment stat count by 1
223#define UE_NET_IRIS_STATS_INCREMENT_FOR_OBJECT(NetStatsContext, StatName, ObjectIndex) \
224 do { \
225 if (NetStatsContext) \
226 { \
227 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*NetStatsContext, ObjectIndex); \
228 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Count++; \
229 } \
230 } while (0)
231
232// Increment stat count by any amount
233#define UE_NET_IRIS_STATS_ADD_COUNT_FOR_OBJECT(NetStatsContext, StatName, ObjectIndex, CountToAdd) \
234 do { \
235 if (NetStatsContext) \
236 { \
237 UE::Net::Private::FNetTypeStatsData& StatsData = UE::Net::Private::FNetStatsContext::GetTypeStatsDataForObject(*NetStatsContext, ObjectIndex); \
238 StatsData.Values[UE::Net::Private::FNetTypeStatsData::EStatsIndex::StatName].Count += CountToAdd; \
239 } \
240 } while (0)
241
242#else
243
244#define UE_NET_IRIS_STATS_ADD_TIME_AND_COUNT_FOR_OBJECT(...)
245#define UE_NET_IRIS_STATS_ADD_TIME_AND_COUNT_FOR_OBJECT_AS_WASTE(...)
246#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_AND_COUNT_FOR_OBJECT(...)
247#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_FOR_OBJECT(...)
248#define UE_NET_IRIS_STATS_ADD_BITS_WRITTEN_FOR_OBJECT_AS_WASTE(...)
249#define UE_NET_IRIS_STATS_INCREMENT_FOR_OBJECT(...)
250#define UE_NET_IRIS_STATS_ADD_COUNT_FOR_OBJECT(...)
251
252#endif
253
254// this is needed for net traces as well
255#if UE_NET_IRIS_CSV_STATS || UE_NET_TRACE_ENABLED
256
257#define UE_NET_IRIS_STATS_TIMER(TimerName, NetStatsContext) UE::Net::Private::FNetStatsTimer TimerName(NetStatsContext);
258
259#else
260
261#define UE_NET_IRIS_STATS_TIMER(...)
262
263#endif
#define check(expr)
Definition AssertionMacros.h:314
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
int32 InternalIndex
Definition VulkanMemory.cpp:4036
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Array.h:670
Definition NetRefHandleManager.h:72
Definition NetStatsContext.h:62
void Release()
Definition NetStatsContext.h:89
void Acquire()
Definition NetStatsContext.h:84
static FNetTypeStatsData & GetTypeStatsDataForObject(FNetStatsContext &Context, FInternalNetRefIndex InternalIndex, uint32 &OutUpdateCount)
Definition NetStatsContext.h:144
bool CanAcquire() const
Definition NetStatsContext.h:78
FNetStatsContext(const FNetStatsContext &)=delete
FNetStatsContext & operator=(const FNetStatsContext &)=delete
static FNetTypeStatsData & GetTypeStatsData(FNetStatsContext &Context, const FNetRefHandleManager::FReplicatedObjectData &ObjectData, bool bTreatAsRoot)
Definition NetStatsContext.h:120
void ResetStats(int32 NumTypeStats)
Definition NetStatsContext.h:153
Definition NetStatsContext.h:105
FNetStatsContext * GetNetStatsContext() const
Definition NetStatsContext.h:114
FNetStatsTimer(FNetStatsContext *InStatsContext)
Definition NetStatsContext.h:107
Definition NetTraceInternal.h:11
Definition NetStats.h:168
static constexpr int32 OOBChannelTypeStatsIndex
Definition NetStats.h:178
static constexpr int32 DefaultTypeStatsIndex
Definition NetStats.h:177
Definition NetworkVersion.cpp:28
uint32 FInternalNetRefIndex
Definition ReplicationStateStorage.h:20
U16 Index
Definition radfft.cpp:71
int32 TypeStatsIndex
Definition ReplicationProtocol.h:125
bool IsSubObject() const
Definition NetRefHandleManager.h:127
const FReplicationProtocol * Protocol
Definition NetRefHandleManager.h:89
FInternalNetRefIndex SubObjectRootIndex
Definition NetRefHandleManager.h:94
uint32 Bits
Definition NetStatsContext.h:39
uint64 Time
Definition NetStatsContext.h:38
void Accumulate(const FStatsValue &Other)
Definition NetStatsContext.h:32
uint32 Count
Definition NetStatsContext.h:40
Definition NetStatsContext.h:16
FStatsValue Values[EStatsIndex::Count]
Definition NetStatsContext.h:58
EStatsIndex
Definition NetStatsContext.h:18
@ WriteWaste
Definition NetStatsContext.h:24
@ Count
Definition NetStatsContext.h:27
@ PreUpdate
Definition NetStatsContext.h:19
@ Write
Definition NetStatsContext.h:23
@ WriteExports
Definition NetStatsContext.h:26
@ Poll
Definition NetStatsContext.h:20
@ PollWaste
Definition NetStatsContext.h:21
@ WriteCreationInfo
Definition NetStatsContext.h:25
@ Quantize
Definition NetStatsContext.h:22
void Accumulate(const FNetTypeStatsData &Other)
Definition NetStatsContext.h:50
void Reset()
Definition NetStatsContext.h:44