UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticlePerfStatsManager.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include "RenderingThread.h"
9
10#if WITH_PARTICLE_PERF_STATS
11
12#define ENABLE_PARTICLE_PERF_STATS_RENDER !UE_BUILD_SHIPPING
13
15
16#define ACCUMULATED_PARTICLE_PERF_STAT_MAX_SAMPLES 10
17
19{
20 uint32 NumFrames;
23
25
27 ENGINE_API void Reset();
29
31 inline uint64 GetTotalCycles() const { return AccumulatedStats.GetTotalCycles(); }
32 inline uint64 GetTotalCycles_GTOnly() const { return AccumulatedStats.GetTotalCycles_GTOnly(); }
33
35 inline uint64 GetPerFrameAvgCycles() const { return NumFrames > 0 ? AccumulatedStats.GetTotalCycles() / NumFrames : 0; }
36 inline uint64 GetPerFrameAvgCycles_GTOnly() const { return NumFrames > 0 ? AccumulatedStats.GetTotalCycles_GTOnly() / NumFrames : 0; }
39
41 inline float GetPerFrameAvg() const { return float(FPlatformTime::ToMilliseconds64(GetPerFrameAvgCycles()) * 1000.0); }
44 inline float GetPerFrameMax(int32 Index = 0) const { return float(FPlatformTime::ToMilliseconds64(GetPerFrameMaxCycles(Index)) * 1000.0); }
45
47 inline uint64 GetPerInstanceAvgCycles() const { return AccumulatedStats.GetPerInstanceAvgCycles(); }
50
52 inline float GetPerInstanceAvg() const { return float(FPlatformTime::ToMilliseconds64(GetPerInstanceAvgCycles()) * 1000.0); }
53 inline float GetPerInstanceAvg_GTOnly() const { return float(FPlatformTime::ToMilliseconds64(AccumulatedStats.GetPerInstanceAvgCycles_GTOnly()) * 1000.0); }
56};
57
59{
60 uint32 NumFrames;
62
65
67 ENGINE_API void Reset();
69
71 inline uint64 GetTotalCycles() const { return AccumulatedStats.GetTotalCycles(); }
72
74 inline uint64 GetPerFrameAvgCycles() const { return NumFrames > 0 ? AccumulatedStats.GetTotalCycles() / NumFrames : 0; }
77
79 inline float GetPerFrameAvg() const { return float(FPlatformTime::ToMilliseconds64(GetPerFrameAvgCycles()) * 1000.0); }
81 inline float GetPerFrameMax(int32 Index = 0) const { return float(FPlatformTime::ToMilliseconds64(GetPerFrameMaxCycles(Index)) * 1000.0); }
82
84 inline uint64 GetPerInstanceAvgCycles() const { return AccumulatedStats.GetPerInstanceAvgCycles(); }
87
89 inline float GetPerInstanceAvg() const { return float(FPlatformTime::ToMilliseconds64(GetPerInstanceAvgCycles()) * 1000.0); }
92};
93
95{
96 uint32 NumFrames;
98
101
103 ENGINE_API void Reset();
105
107 inline uint64 GetTotalMicroseconds() const { return AccumulatedStats.GetTotalMicroseconds(); }
108
109 inline uint64 GetPerFrameAvgMicroseconds() const { return NumFrames > 0 ? AccumulatedStats.GetTotalMicroseconds() / NumFrames : 0; }
111
112 inline uint64 GetPerInstanceAvgMicroseconds() const { return AccumulatedStats.GetPerInstanceAvgMicroseconds(); }
114};
115
118{
120
121 ENGINE_API void Reset(bool bSyncWithRT);
122 ENGINE_API void ResetGT();
123 ENGINE_API void ResetRT();
125 ENGINE_API void TickRT(FParticlePerfStats& Stats);
126
127 FAccumulatedParticlePerfStats_GT GameThreadStats;
128 FAccumulatedParticlePerfStats_RT RenderThreadStats;
130
133
135 inline FAccumulatedParticlePerfStats_GT& GetGameThreadStats()
136 {
137 return GameThreadStats;
138 }
139
141 inline FAccumulatedParticlePerfStats_RT& GetRenderThreadStats(bool bFlushForGameThread = false)
142 {
143 if ( IsInGameThread() )
144 {
146 {
148 }
149 }
150 else
151 {
153 }
154 return RenderThreadStats;
155 }
156
158 inline FAccumulatedParticlePerfStats_GPU& GetGPUStats(bool bFlushForGameThread = false)
159 {
160 if (IsInGameThread())
161 {
163 {
165 }
166 }
167 else
168 {
170 }
171 return GPUStats;
172 }
173};
174
175class FParticlePerfStatsListener : public TSharedFromThis<FParticlePerfStatsListener, ESPMode::ThreadSafe>
176{
177public:
178 virtual ~FParticlePerfStatsListener() {}
179
181 virtual void Begin(){}
183 virtual void End(){}
185 virtual bool Tick() { return true; }
187 virtual void TickRT() {}
188
190 virtual void OnAddWorld(const TWeakObjectPtr<const UWorld>& NewWorld) {}
192 virtual void OnRemoveWorld(const TWeakObjectPtr<const UWorld>& World) {}
194 virtual void OnAddSystem(const TWeakObjectPtr<const UFXSystemAsset>& NewSystem){}
196 virtual void OnRemoveSystem(const TWeakObjectPtr<const UFXSystemAsset>& System) {}
201
202
203 virtual bool NeedsWorldStats() const = 0;
204 virtual bool NeedsSystemStats() const = 0;
205 virtual bool NeedsComponentStats() const = 0;
206
212 virtual bool AllowOrphaned() const { return false; }
213};
214
217{
218public:
220#if CSV_PROFILER_STATS
223#endif
224
230
231#if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
236#endif
237
238#if WITH_PER_COMPONENT_PARTICLE_PERF_STATS
243#endif
244
246 static ENGINE_API FParticlePerfStats* GetWorldPerfStats(const UWorld* World);
247 static ENGINE_API FParticlePerfStats* GetSystemPerfStats(const UFXSystemAsset* FXAsset);
248 static ENGINE_API FParticlePerfStats* GetComponentPerfStats(const UFXSystemComponent* FXComponent);
249
250 static ENGINE_API void OnStartup();
251 static ENGINE_API void OnShutdown();
252
254 static ENGINE_API int32 RenderStats(UWorld* World, class FViewport* Viewport, class FCanvas* Canvas, int32 X, int32 Y, const FVector* ViewLocation, const FRotator* ViewRotation);
255
256 static ENGINE_API void Reset();
257 static ENGINE_API void Tick();
258
259 static ENGINE_API void AddListener(FParticlePerfStatsListenerPtr Listener, bool bReset = true);
260 static ENGINE_API void RemoveListener(FParticlePerfStatsListener* Listener);
261 static ENGINE_API void RemoveListener(FParticlePerfStatsListenerPtr Listener);
262
263#if ENABLE_PARTICLE_PERF_STATS_RENDER
266#endif
267
269 template<typename TAction>
270 static void ForAllWorldStats(TAction Func)
271 {
274 {
275 Func(Pair.Key, Pair.Value);
276 }
277 }
278
280 template<typename TAction>
281 static void ForAllSystemStats(TAction Func)
282 {
283 #if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
286 {
287 Func(Pair.Key, Pair.Value);
288 }
289 #endif
290 }
291
293 template<typename TAction>
294 static void ForAllComponentStats(TAction Func)
295 {
296#if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
299 {
300 Func(Pair.Key, Pair.Value);
301 }
302#endif
303 }
304};
305
308{
309public:
314 {}
315
317
318 ENGINE_API virtual void Begin() override;
319 ENGINE_API virtual void End() override;
320 ENGINE_API virtual bool Tick() override;
321 ENGINE_API virtual void TickRT() override;
322
323 ENGINE_API virtual void OnAddWorld(const TWeakObjectPtr<const UWorld>& NewWorld)override;
324 ENGINE_API virtual void OnRemoveWorld(const TWeakObjectPtr<const UWorld>& World)override;
325
326 #if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
327 ENGINE_API virtual void OnAddSystem(const TWeakObjectPtr<const UFXSystemAsset>& NewSystem)override;
328 ENGINE_API virtual void OnRemoveSystem(const TWeakObjectPtr<const UFXSystemAsset>& System)override;
329 #endif
330
331 #if WITH_PER_COMPONENT_PARTICLE_PERF_STATS
334 #endif
335
336 virtual bool NeedsWorldStats() const override { return bGatherWorldStats; }
337 virtual bool NeedsSystemStats() const override { return bGatherSystemStats; }
338 virtual bool NeedsComponentStats() const override { return bGatherComponentStats; }
339
342
343#if WITH_PARTICLE_PERF_STATS
345#else
346 FAccumulatedParticlePerfStats* GetStats(const UWorld* World) { return nullptr; }
347#endif
348#if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
350#else
351 FAccumulatedParticlePerfStats* GetStats(const UFXSystemAsset* System){ return nullptr; }
352#endif
353#if WITH_PER_COMPONENT_PARTICLE_PERF_STATS
355#else
356 FAccumulatedParticlePerfStats* GetStats(const UFXSystemComponent* Component){ return nullptr; }
357#endif
358
359protected:
361
362 const uint8 bGatherWorldStats : 1;
363 const uint8 bGatherSystemStats : 1;
365
367
368#if WITH_PER_SYSTEM_PARTICLE_PERF_STATS
370#endif
371
372#if WITH_PER_COMPONENT_PARTICLE_PERF_STATS
374#endif
375
376 template<typename T, typename TFunc>
378};
379
382{
383public:
385
386 ENGINE_API virtual void End()override;
387 ENGINE_API virtual bool Tick()override;
388
389 virtual bool AllowOrphaned() const { return true; }
390
391private:
393};
394
397{
398public:
400
401#if WITH_PARTICLE_PERF_CSV_STATS
402 ENGINE_API virtual bool Tick()override;
403 ENGINE_API virtual void TickRT()override;
404 ENGINE_API virtual void End()override;
405
406 static ENGINE_API void OnCSVStart();
407 static ENGINE_API void OnCSVEnd();
408#endif
409
410private:
412};
413
419{
420public:
422 ENGINE_API int32 RenderStats(UWorld* World, class FViewport* Viewport, class FCanvas* Canvas, int32 X, int32 Y, const FVector* ViewLocation, const FRotator* ViewRotation);
423};
424
425#else
426
428
429#endif
#define ensure( InExpression)
Definition AssertionMacros.h:464
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
return true
Definition ExternalRpcRegistry.cpp:601
#define X(Name, Desc)
Definition FormatStringSan.h:47
void FlushRenderingCommands()
Definition RenderingThread.cpp:1272
USkinnedMeshComponent float
Definition SkinnedMeshComponent.h:60
CORE_API bool IsInGameThread()
Definition ThreadingBase.cpp:185
CORE_API bool IsInRenderingThread()
Definition ThreadingBase.cpp:273
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CanvasTypes.h:211
Definition IDelegateInstance.h:14
Definition OutputDevice.h:133
Definition ScopeLock.h:141
Definition UnrealClient.h:412
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition SharedPointer.h:1640
Definition SharedPointer.h:692
Definition ContainerAllocationPolicies.h:894
Definition UniquePtr.h:107
Definition ParticleSystem.h:118
Definition ParticleSystemComponent.h:380
Definition World.h:918
@ false
Definition radaudio_common.h:23
U16 Index
Definition radfft.cpp:71
Definition ParticlePerfStatsManager.h:427
static double ToMilliseconds64(const uint64 Cycles)
Definition GenericPlatformTime.h:202
Definition ParticlePerfStats.h:148
Definition ParticlePerfStats.h:43
Definition ParticlePerfStats.h:122
Definition ParticlePerfStats.h:171
Definition Tuple.h:652
Definition WeakObjectPtrTemplates.h:25