UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetStatsUtils.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "CoreMinimal.h"
7#include "CoreTypes.h"
8#include "Misc/Optional.h"
10#include "Templates/Models.h"
11
12#include <limits>
13
14
15namespace UE::Net
16{
17
28template<typename ConsumerType>
30{
31 struct CSampleConsumer
32 {
33 template<typename T>
34 auto Requires(T& A) -> decltype(
35 A.AddSample(0.0)
36 );
37 };
38
39 struct CPeekMeasurements
40 {
41 template<typename T>
42 auto Requires(T& A) -> decltype(
43 A.PeekMeasurement(0.0, 0.0)
44 );
45 };
46
47 static_assert(TModels_V<CSampleConsumer, ConsumerType>, "ConsumerType must implement AddSample(double Val)");
48
49public:
56 {
57 Consumer = InConsumer;
58 }
59
60protected:
66 void OutputSample(double Value)
67 {
68 if (Consumer != nullptr)
69 {
70 Consumer->AddSample(Value);
71 }
72 }
73
80 template<typename InnerConsumerType=ConsumerType, typename = typename TEnableIf<TModels_V<CPeekMeasurements, InnerConsumerType>>::Type>
81 inline void PeekMeasurement(double TimeVal, double Value)
82 {
83 if (Consumer != nullptr)
84 {
85 Consumer->PeekMeasurement(TimeVal, Value);
86 }
87 }
88
89 template<typename InnerConsumerType=ConsumerType, typename = typename TEnableIf<!TModels_V<CPeekMeasurements, InnerConsumerType>>::Type, int32 UnusedParamForODR=0>
90 inline void PeekMeasurement(double TimeVal, double Value)
91 {
92 }
93
94private:
96 ConsumerType* Consumer;
97};
98
103{
105 MovingAvg,
106
109};
110
116{
117protected:
118 struct FBin
119 {
121 double Sum = 0.0;
122
125 };
126
127protected:
130
139
140public:
146 NETCORE_API double GetSample() const;
147
151 NETCORE_API void Reset();
152
153private:
154 NETCORE_API void ResetNewAndSkippedBins(int32 BinIdx, TOptional<double>& OutSample);
155
156
157private:
159 const TArrayView<FBin> BinsView;
160
162 const double TimePerBin = 0.0;
163
165 const double BinRange = 0.0;
166
169
171 int32 FirstBinIndex = INDEX_NONE;
172
174 int32 LastWrittenBinIndex = INDEX_NONE;
175
177 double TotalSum = 0.0;
178
180 int32 TotalCount = 0;
181};
182
198template<typename ConsumerType, int32 NumBins, EBinnedValueMode InMode>
200{
201public:
207 explicit TBinnedMovingValue(double TimePerBin)
208 : FBinnedMovingValueBase(MakeArrayView(Bins, NumBins), TimePerBin, InMode)
209 {
210 }
211
230
239 void Flush()
240 {
241 this->OutputSample(GetSample());
242 }
243
244private:
246 FBin Bins[NumBins] = {};
247};
248
259template<typename ConsumerType, int32 NumBins, EBinnedValueMode InMode>
260class TBinnedDeltaMovingValue : private TBinnedMovingValue<ConsumerType, NumBins, InMode>
261{
263
264public:
265 // Using Super for constructors can break clang
266 using TBinnedMovingValue<ConsumerType, NumBins, InMode>::TBinnedMovingValue;
267 using Super::SetConsumer;
268 using Super::GetSample;
269 using Super::Flush;
270
277 void AddMeasurement(double TimeVal, double Value)
278 {
279 if (LastValue != std::numeric_limits<double>::min())
280 {
281 Super::AddMeasurement(TimeVal, (Value - LastValue));
282 }
283
284 LastValue = Value;
285 }
286
290 void Reset()
291 {
292 Super::Reset();
293
294 LastValue = std::numeric_limits<double>::min();
295 }
296
297private:
299 double LastValue = std::numeric_limits<double>::min();
300};
301
305template<typename ConsumerType, int32 NumBins>
307
311template<typename ConsumerType, int32 NumBins>
313
317template<typename ConsumerType, int32 NumBins>
319
323template<typename ConsumerType, int32 NumBins>
325
326}
327
332namespace TBinParms
333{
334 static constexpr int32 NumBins(int32 InNumBins)
335 {
336 return InNumBins;
337 }
338
339 static constexpr double TimePerBin(double InBinSize)
340 {
341 return InBinSize;
342 }
343}
344
345
346namespace UE::Net
347{
348
352enum EMinMaxValueMode
353{
355 PerSample,
356
358 PerMeasurement,
359
361 PerTimeSeconds
362};
363
370class FSampleMinMaxAvg
371{
372 template<EMinMaxValueMode, int32> friend class TSampleMinMaxAvg;
373
374private:
375 NETCORE_API void AddSample_Internal(double Value);
376
377public:
381 NETCORE_API void Reset();
382
388 double GetMin() const
389 {
390 return ((MinValue == std::numeric_limits<double>::max()) ? 0.0 : MinValue);
391 }
392
398 double GetMax() const
399 {
400 return ((MaxValue == std::numeric_limits<double>::min()) ? 0.0 : MaxValue);
401 }
402
408 double GetCurrent() const
409 {
410 return CurrentValue;
411 }
412
418 double GetAvg() const
419 {
420 return TotalCount == 0 ? 0.0 : (TotalSum / static_cast<double>(TotalCount));
421 }
422
428 double GetSum() const
429 {
430 return TotalSum;
431 }
432
438 int32 GetSampleCount() const
439 {
440 return TotalCount;
441 }
442
443private:
445 double MinValue = std::numeric_limits<double>::max();
446
448 double MaxValue = std::numeric_limits<double>::min();
449
451 double CurrentValue = 0.0;
452
454 double TotalSum = 0.0;
455
457 int32 TotalCount = 0;
458};
459
467template<EMinMaxValueMode Mode, int32 MinMaxTimeSeconds=1>
468class TSampleMinMaxAvg;
469
470template<>
471class TSampleMinMaxAvg<EMinMaxValueMode::PerSample> : public FSampleMinMaxAvg
472{
473public:
477 void AddSample(double Value)
478 {
479 if (Value < MinValue)
480 {
481 MinValue = Value;
482 }
483
484 if (Value > MaxValue)
485 {
486 MaxValue = Value;
487 }
488
489 AddSample_Internal(Value);
490 }
491};
492
493template<>
494class TSampleMinMaxAvg<EMinMaxValueMode::PerMeasurement> : public FSampleMinMaxAvg
495{
496public:
500 inline void AddSample(double Value)
501 {
502 AddSample_Internal(Value);
503 }
504
505 void PeekMeasurement(double TimeVal, double Value)
506 {
507 if (Value < MinValue)
508 {
509 MinValue = Value;
510 }
511
512 if (Value > MaxValue)
513 {
514 MaxValue = Value;
515 }
516 }
517};
518
519template<int32 MinMaxTimeSeconds>
520class TSampleMinMaxAvg<EMinMaxValueMode::PerTimeSeconds, MinMaxTimeSeconds> : public FSampleMinMaxAvg
521{
522public:
526 inline void AddSample(double Value)
527 {
528 AddSample_Internal(Value);
529 }
530
531 void PeekMeasurement(double TimeVal, double Value)
532 {
533 if (UNLIKELY(MinMaxPeriodStart == 0.0))
534 {
535 MinMaxPeriodStart = TimeVal;
536 }
537 else if ((TimeVal - MinMaxPeriodStart) >= static_cast<double>(MinMaxTimeSeconds))
538 {
539 const double NewMinMaxSample = MinMaxPeriodSum / MinMaxPeriodCount;
540
541 if (NewMinMaxSample < MinValue)
542 {
544 }
545
546 if (NewMinMaxSample > MaxValue)
547 {
549 }
550
551 MinMaxPeriodStart = TimeVal;
552 MinMaxPeriodSum = 0.0;
553 MinMaxPeriodCount = 0;
554 }
555
556 MinMaxPeriodSum += Value;
557 MinMaxPeriodCount++;
558 }
559
560private:
562 double MinMaxPeriodStart = 0.0;
563
565 double MinMaxPeriodSum = 0.0;
566
568 int32 MinMaxPeriodCount = 0;
569};
570
574class FUsingNetStatsUtils
575{
576public:
577 template<typename ConsumerType> using TSampleProducer = TSampleProducer<ConsumerType>;
579 template<typename ConsumerType, int32 NumBins, EBinnedValueMode InMode> using TBinnedMovingValue =
581 template<typename ConsumerType, int32 NumBins, EBinnedValueMode InMode> using TBinnedDeltaMovingValue =
583 template<typename ConsumerType, int32 NumBins> using TBinnedMovingAvg = TBinnedMovingAvg<ConsumerType, NumBins>;
584 template<typename ConsumerType, int32 NumBins> using TDeltaBinnedMovingAvg = TDeltaBinnedMovingAvg<ConsumerType, NumBins>;
585 template<typename ConsumerType, int32 NumBins> using TBinnedMovingSum = TBinnedMovingSum<ConsumerType, NumBins>;
586 template<typename ConsumerType, int32 NumBins> using TDeltaBinnedMovingSum = TDeltaBinnedMovingSum<ConsumerType, NumBins>;
587 using EMinMaxValueMode = EMinMaxValueMode;
588 using FSampleMinMaxAvg = FSampleMinMaxAvg;
589 template<EMinMaxValueMode Mode, int32 MinMaxTimeSeconds=1> using TSampleMinMaxAvg = TSampleMinMaxAvg<Mode, MinMaxTimeSeconds>;
590};
591
592}
593
599{
600 static constexpr int32 TimeSeconds(int32 InTimeSeconds)
601 {
602 return InTimeSeconds;
603 }
604}
605
constexpr auto MakeArrayView(OtherRangeType &&Other)
Definition ArrayView.h:873
@ INDEX_NONE
Definition CoreMiscDefines.h:150
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
#define UNLIKELY(x)
Definition Platform.h:857
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition ArrayView.h:139
Definition NetStatsUtils.h:116
NETCORE_API void Reset()
Definition NetStatsUtils.cpp:23
NETCORE_API void AddMeasurement_Implementation(double TimeVal, double Value, TOptional< double > &OutSample)
Definition NetStatsUtils.cpp:36
NETCORE_API double GetSample() const
Definition NetStatsUtils.cpp:61
Definition NetStatsUtils.h:261
void AddMeasurement(double TimeVal, double Value)
Definition NetStatsUtils.h:277
void Reset()
Definition NetStatsUtils.h:290
Definition NetStatsUtils.h:200
void AddMeasurement(double TimeVal, double Value)
Definition NetStatsUtils.h:218
void Flush()
Definition NetStatsUtils.h:239
TBinnedMovingValue(double TimePerBin)
Definition NetStatsUtils.h:207
Definition NetStatsUtils.h:30
void PeekMeasurement(double TimeVal, double Value)
Definition NetStatsUtils.h:81
void PeekMeasurement(double TimeVal, double Value)
Definition NetStatsUtils.h:90
void OutputSample(double Value)
Definition NetStatsUtils.h:66
void SetConsumer(ConsumerType *InConsumer)
Definition NetStatsUtils.h:55
int32 GetMax(const FIntVector3 &V)
Definition Utilities.h:67
int32 GetMin(const FIntVector3 &V)
Definition Utilities.h:53
constexpr int32 MaxValue
Definition LandscapeDataAccess.h:26
Definition NetStatsUtils.h:333
Definition NetStatsUtils.h:599
constexpr double MinValue(bool OnlyInside)
Definition Geometry.cpp:53
Definition NetworkVersion.cpp:28
EBinnedValueMode
Definition NetStatsUtils.h:103
TBinnedMovingValue< ConsumerType, NumBins, EBinnedValueMode::MovingAvg > TBinnedMovingAvg
Definition NetStatsUtils.h:306
TBinnedDeltaMovingValue< ConsumerType, NumBins, EBinnedValueMode::MovingSum > TDeltaBinnedMovingSum
Definition NetStatsUtils.h:324
TBinnedDeltaMovingValue< ConsumerType, NumBins, EBinnedValueMode::MovingAvg > TDeltaBinnedMovingAvg
Definition NetStatsUtils.h:312
TBinnedMovingValue< ConsumerType, NumBins, EBinnedValueMode::MovingSum > TBinnedMovingSum
Definition NetStatsUtils.h:318
Definition Optional.h:131
constexpr OptionalType & GetValue()
Definition Optional.h:443
Definition NetStatsUtils.h:119
double Sum
Definition NetStatsUtils.h:121
int32 Count
Definition NetStatsUtils.h:124