UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ParticleSystemManager.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreMinimal.h"
9#include "Engine/World.h"
10
11#include "ParticleSystemManager.generated.h"
12
13class UActorComponent;
14class UParticleSystemComponent;
16
17//Whether to use dynamic or static lists.
18//Static lists are possibly cheaper but dynamic list have benefit of reduced complexity, likely easier to implement budgeted system in future and will access tick data more contiguously which may offset the cost of building them.
19#define PSC_MAN_USE_STATIC_TICK_LISTS 1
20
21//If we our final TG should wait for our async tasks to complete before completing itself.
22//Likely required to ensure nothing overruns EOF updates.
23#define PSC_MAN_TG_WAIT_FOR_ASYNC 1
24
50
51USTRUCT()
53{
55
56 //~ FTickFunction Interface
57 ENGINE_API virtual void ExecuteTick(float DeltaTime, ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) override;
58 ENGINE_API virtual FString DiagnosticMessage() override;
59 ENGINE_API virtual FName DiagnosticContext(bool bDetailed) override;
60 //~ FTickFunction Interface
61
63};
64
65template<>
66struct TStructOpsTypeTraits<FParticleSystemWorldManagerTickFunction> : public TStructOpsTypeTraitsBase2<FParticleSystemWorldManagerTickFunction>
67{
68 enum
69 {
70 WithCopy = false
71 };
72};
73
74//Define this so we can create inline alloc arrays of the right size but still allow runtime modification if desired.
75#define INITIAL_PSC_MANAGER_ASYNC_BATCH_SIZE 8
77
82{
83private:
84 static const int32 MaxTickGroup = (int32)TG_NewlySpawned;
86
87 static void OnWorldInit(UWorld* World, const UWorld::InitializationValues IVS);
88 static void OnWorldCleanup(UWorld* World, bool bSessionEnded, bool bCleanupResources);
89 static void OnPreWorldFinishDestroy(UWorld* World);
90 static void OnWorldBeginTearDown(UWorld* World);
91
92 typedef TFunction<void(UParticleSystemComponent*, FPSCTickData&, int32)> FPSCTickListFunction;
93
94 struct FTickList
95 {
97 :Owner(InOwner)
98 {
99 }
100
102
104 TArray<int32> TickList;
105
106 void Add(int32 Handle);
107 void Remove(int32 Handle);
108 void Reset();
109 inline int32 Num()const { return TickList.Num(); }
110 inline int32& operator[](const int32 Index) { return TickList[Index]; }
111 inline TArray<int32>& Get() { return TickList; }
112 };
113
114public:
115 static void OnStartup();
116 static void OnShutdown();
117
119 {
120 FParticleSystemWorldManager** Ret = WorldManagers.Find(World);
121 if (Ret)
122 {
123 checkSlow(*Ret);
124 return *Ret;
125 }
126 return nullptr;
127 }
128
131 void Cleanup();
132
133 bool RegisterComponent(UParticleSystemComponent* PSC);
134 void UnregisterComponent(UParticleSystemComponent* PSC);
135
136 inline FPSCTickData& GetTickData(int32 Handle) { return PSCTickData[Handle]; }
137 inline UParticleSystemComponent* GetManagedComponent(int32 Handle) { return ManagedPSCs[Handle]; }
138
139 void Tick(ETickingGroup TickGroup, float DeltaTime, ELevelTick TickType, ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent);
140
141 // FGCObject interface
142 virtual void AddReferencedObjects(FReferenceCollector& Collector) override;
143 virtual FString GetReferencerName() const override;
144
145 void Dump();
146
147 void SetTickGroupPriority(const int32 ParticleSystemTickGroupIndex, const bool bHighPriority);
149
150protected:
153
154
155private:
156
157 void BuildTickLists(int32 StartIndex, ETickingGroup CurrTickGroup);
158
159 template<bool bAsync>
160 void ProcessTickList(float DeltaTime, ELevelTick TickType, ETickingGroup TickGroup, TArray<FTickList>& TickLists, const FGraphEventRef& TickGroupCompletionGraphEvent);
161 inline void FlushAsyncTicks(const FGraphEventRef& TickGroupCompletionGraphEvent);
162 inline void QueueAsyncTick(int32 Handle, const FGraphEventRef& TickGroupCompletionGraphEvent);
163
164 void AddPSC(UParticleSystemComponent* PSC);
165 void RemovePSC(int32 PSCIndex);
166
167 void HandleManagerEnabled();
168
169 void ClearPendingUnregister();
170
171 UWorld* World;
172
174
176 TArray<FPSCTickData> PSCTickData;
177
179 TArray<FTickList> TickLists_Concurrent;
180
182 TArray<FTickList> TickLists_GT;
183
189
191 int32 bCachedParticleWorldManagerEnabled;
192
194 FDelegateHandle PostGarbageCollectHandle;
195
196 FPSCManagerAsyncTickBatch AsyncTickBatch;
197
198#if !UE_BUILD_SHIPPING
199 static const UEnum* TickGroupEnum;
200#endif
201};
202
OODEFFUNC typedef void(OODLE_CALLBACK t_fp_OodleCore_Plugin_Free)(void *ptr)
#define checkSlow(expr)
Definition AssertionMacros.h:332
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
ETickingGroup
Definition EngineBaseTypes.h:84
ELevelTick
Definition EngineBaseTypes.h:70
@ Num
Definition MetalRHIPrivate.h:234
#define USTRUCT(...)
Definition ObjectMacros.h:746
#define GENERATED_USTRUCT_BODY(...)
Definition ObjectMacros.h:767
ENGINE_API int32 GbEnablePSCWorldManager
Definition ParticleSystemManager.cpp:23
TArray< int32, TInlineAllocator< INITIAL_PSC_MANAGER_ASYNC_BATCH_SIZE > > FPSCManagerAsyncTickBatch
Definition ParticleSystemManager.h:76
uint8_t uint8
Definition binka_ue_file_header.h:8
Definition IDelegateInstance.h:14
Definition GCObject.h:128
Definition NameTypes.h:617
Definition ParticleSystemManager.h:82
virtual void AddReferencedObjects(FReferenceCollector &Collector) override
Definition ParticleSystemManager.cpp:282
void HandlePostGarbageCollect()
Definition ParticleSystemManager.cpp:336
virtual ~FParticleSystemWorldManager()
Definition ParticleSystemManager.cpp:276
void Cleanup()
Definition ParticleSystemManager.cpp:348
UParticleSystemComponent * GetManagedComponent(int32 Handle)
Definition ParticleSystemManager.h:137
void Dump()
Definition ParticleSystemManager.cpp:842
static void OnShutdown()
Definition ParticleSystemManager.cpp:187
bool RegisterComponent(UParticleSystemComponent *PSC)
Definition ParticleSystemManager.cpp:374
static void OnStartup()
Definition ParticleSystemManager.cpp:176
static FParticleSystemWorldManager * Get(UWorld *World)
Definition ParticleSystemManager.h:118
static void SetFirstHighPriTickGroup(int FirstHighPriTickGroupIndex)
Definition ParticleSystemManager.cpp:882
void SetTickGroupPriority(const int32 ParticleSystemTickGroupIndex, const bool bHighPriority)
Definition ParticleSystemManager.cpp:876
FPSCTickData & GetTickData(int32 Handle)
Definition ParticleSystemManager.h:136
void UnregisterComponent(UParticleSystemComponent *PSC)
Definition ParticleSystemManager.cpp:418
virtual FString GetReferencerName() const override
Definition ParticleSystemManager.cpp:331
Definition UObjectGlobals.h:2492
Definition Array.h:670
UE_REWRITE SizeType Num() const
Definition Array.h:1144
Definition EnumAsByte.h:22
Definition AndroidPlatformMisc.h:14
Definition UnrealString.h.inl:34
Definition ActorComponent.h:152
Definition Class.h:2791
Definition World.h:918
Type
Definition TaskGraphInterfaces.h:57
U16 Index
Definition radfft.cpp:71
Definition ParticleSystemManager.h:29
uint8 bPendingReregister
Definition ParticleSystemManager.h:48
uint8 bCanTickConcurrent
Definition ParticleSystemManager.h:44
TObjectPtr< UActorComponent > PrereqComponent
Definition ParticleSystemManager.h:33
TEnumAsByte< ETickingGroup > TickGroup
Definition ParticleSystemManager.h:41
int32 TickListHandle
Definition ParticleSystemManager.h:37
uint8 bPendingUnregister
Definition ParticleSystemManager.h:46
FPSCTickData()
Definition ParticleSystemManager.cpp:921
Definition ParticleSystemManager.h:53
FParticleSystemWorldManager * Owner
Definition ParticleSystemManager.h:62
Definition EngineBaseTypes.h:173
Definition WorldInitializationValues.h:9
Definition ObjectPtr.h:488
Definition StructOpsTypeTraits.h:11
@ WithCopy
Definition StructOpsTypeTraits.h:17
Definition StructOpsTypeTraits.h:46