UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MediaObjectPool.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Containers/Array.h"
6#include "Containers/Queue.h"
7#include "Misc/ScopeLock.h"
10
11
16{
17public:
18
27 virtual void InitializePoolable() { }
28
37 virtual void ShutdownPoolable() { }
38
42 virtual bool IsReadyForReuse()
43 {
44 return true;
45 }
46
47public:
48
50 virtual ~IMediaPoolable() { }
51};
52
53
54template<typename ObjectType> class TMediaPoolDefaultObjectAllocator
55{
56public:
57 static ObjectType *Alloc() { return new ObjectType; }
58};
59
68template<typename ObjectType, typename ObjectAllocator=TMediaPoolDefaultObjectAllocator<ObjectType>>
70{
71 static_assert(TPointerIsConvertibleFromTo<ObjectType, IMediaPoolable>::Value, "Poolable objects must implement the IMediaPoolable interface.");
72
74 class TStorage
75 {
76 public:
78 : ObjectAllocatorInstance(InObjectAllocatorInstance)
79 {}
80
82 ~TStorage()
83 {
84 Reserve(0);
85 ObjectType* Object;
86 while (WaitReadyForReuse.Dequeue(Object))
87 {
88 Object->ShutdownPoolable();
89 delete Object;
90 }
91 }
92
93 public:
94
99 ObjectType* Acquire(bool bAlloc = true)
100 {
101 ObjectType* Result = nullptr;
102 {
103 FScopeLock Lock(&CriticalSection);
104
105 if (Pool.Num() > 0)
106 {
107 Result = Pool.Pop(EAllowShrinking::No);
108 }
109 else
110 {
111 // Check for objects to ready to enter the pool & grab the first we find as our result...
112 // (we move all into the pool, we can to possibly safe on resources allocated by the objects)
113 ObjectType* PeekObject;
114 while (WaitReadyForReuse.Peek(PeekObject))
115 {
116 if (!PeekObject->IsReadyForReuse())
117 {
118 break;
119 }
120
121 WaitReadyForReuse.Pop();
122 PeekObject->ShutdownPoolable();
123 if (!Result)
124 {
125 Result = PeekObject;
126 }
127 else
128 {
129 Pool.Add(PeekObject);
130 }
131 }
132 }
133 }
134
135 if (Result == nullptr && bAlloc)
136 {
137 Result = ObjectAllocatorInstance->Alloc();
138 }
139 else
140 {
141 return Result;
142 }
143
144 Result->InitializePoolable();
145
146 return Result;
147 }
148
150 int32 Num() const
151 {
152 FScopeLock Lock(&CriticalSection);
153 return Pool.Num();
154 }
155
157 void Release(ObjectType* Object)
158 {
159 if (Object == nullptr)
160 {
161 return;
162 }
163
164 FScopeLock Lock(&CriticalSection);
165
166 if (Object->IsReadyForReuse())
167 {
168 Object->ShutdownPoolable();
169 Pool.Push(Object);
170 }
171 else
172 {
173 WaitReadyForReuse.Enqueue(Object);
174 }
175 }
176
178 void Reserve(uint32 NumObjects)
179 {
180 FScopeLock Lock(&CriticalSection);
181
182 while (NumObjects < (uint32)Pool.Num())
183 {
184 delete Pool.Pop(EAllowShrinking::No);
185 }
186
187 while (NumObjects > (uint32)Pool.Num())
188 {
189 Pool.Push(ObjectAllocatorInstance->Alloc());
190 }
191 }
192
194 void Tick()
195 {
196 if (WaitReadyForReuse.IsEmpty())
197 {
198 // Conservative early out to avoid CS: we will get any items missed the next time around
199 return;
200 }
201
202 FScopeLock Lock(&CriticalSection);
203
204 ObjectType* Object;
205 while (WaitReadyForReuse.Peek(Object))
206 {
207 if (!Object->IsReadyForReuse())
208 {
209 break;
210 }
211
212 Object->ShutdownPoolable();
213 Pool.Push(Object);
214 WaitReadyForReuse.Pop();
215 }
216 }
217
218 private:
219
221 mutable FCriticalSection CriticalSection;
222
225
227 TQueue<ObjectType*> WaitReadyForReuse;
228
230 ObjectAllocator *ObjectAllocatorInstance;
231 };
232
233
235 class TDeleter
236 {
237 public:
238
241 : StoragePtr(InStorage)
242 { }
243
245 void operator()(ObjectType* ObjectToDelete)
246 {
248
249 if (PinnedStorage.IsValid())
250 {
252 }
253 else
254 {
255 delete ObjectToDelete;
256 }
257 }
258
259 private:
260
263 };
264
265public:
266
268 TMediaObjectPool(ObjectAllocator *ObjectAllocatorInstance = nullptr)
269 : Storage(MakeShareable(new TStorage(ObjectAllocatorInstance)))
270 { }
271
278 : Storage(MakeShareable(new TStorage(nullptr)))
279 {
280 Storage->Reserve(NumReserve);
281 }
282
283public:
284
296 ObjectType* Acquire(bool bAlloc = true)
297 {
298 return Storage->Acquire(bAlloc);
299 }
300
311 {
312 ObjectType* Object = Acquire(true);
313 check(Object != nullptr);
314 return MakeShareable(Object, TDeleter(Storage));
315 }
316
328 {
329 ObjectType* Object = Acquire(bAlloc);
330 if (!Object && !bAlloc)
331 {
332 return nullptr;
333 }
334 check(Object != nullptr);
335
336 return MakeShareable(Object, TDeleter(Storage));
337 }
338
344 int32 Num() const
345 {
346 return Storage->Num();
347 }
348
357 {
358 return MakeShareable(Object, TDeleter(Storage));
359 }
360
370 void Release(ObjectType* Object)
371 {
372 Storage->Release(Object);
373 }
374
381 void Reset(uint32 NumObjects = 0)
382 {
383 Storage->Reserve(NumObjects);
384 }
385
389 void Tick()
390 {
391 Storage->Tick();
392 }
393
394private:
395
398};
#define check(expr)
Definition AssertionMacros.h:314
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
SharedPointerInternals::TRawPtrProxy< ObjectType > MakeShareable(ObjectType *InObject)
Definition SharedPointer.h:1947
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
@ Num
Definition MetalRHIPrivate.h:234
FRWLock Lock
Definition UnversionedPropertySerialization.cpp:921
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ScopeLock.h:141
Definition MediaObjectPool.h:16
virtual ~IMediaPoolable()
Definition MediaObjectPool.h:50
virtual bool IsReadyForReuse()
Definition MediaObjectPool.h:42
virtual void InitializePoolable()
Definition MediaObjectPool.h:27
virtual void ShutdownPoolable()
Definition MediaObjectPool.h:37
Definition Array.h:670
Definition MediaObjectPool.h:70
TSharedPtr< ObjectType, ESPMode::ThreadSafe > AcquireShared(bool bAlloc)
Definition MediaObjectPool.h:327
ObjectType * Acquire(bool bAlloc=true)
Definition MediaObjectPool.h:296
TMediaObjectPool(ObjectAllocator *ObjectAllocatorInstance=nullptr)
Definition MediaObjectPool.h:268
TSharedRef< ObjectType, ESPMode::ThreadSafe > ToShared(ObjectType *Object)
Definition MediaObjectPool.h:356
TSharedRef< ObjectType, ESPMode::ThreadSafe > AcquireShared()
Definition MediaObjectPool.h:310
TMediaObjectPool(uint32 NumReserve)
Definition MediaObjectPool.h:277
void Reset(uint32 NumObjects=0)
Definition MediaObjectPool.h:381
void Release(ObjectType *Object)
Definition MediaObjectPool.h:370
void Tick()
Definition MediaObjectPool.h:389
int32 Num() const
Definition MediaObjectPool.h:344
Definition MediaObjectPool.h:55
static ObjectType * Alloc()
Definition MediaObjectPool.h:57
Definition Queue.h:48
Definition SharedPointer.h:692
Definition SharedPointer.h:153
Definition SharedPointer.h:1295
Definition PointerIsConvertibleFromTo.h:60