UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
MassEntityManagerStorage.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2#pragma once
3
6#include "Misc/TVariant.h"
9
12
18
30{
35 uint32 MaxEntityCount = 1 << 30; // 1 billion
36
41 uint32 MaxEntitiesPerPage = 1 << 16; // 65536
42};
43
45
46namespace UE::Mass
47{
53 {
54 public:
55 enum class EEntityState
56 {
58 Free,
63 };
64 virtual ~IEntityStorageInterface() = default;
65
67 virtual const FMassArchetypeData* GetArchetype(int32 Index) const = 0;
70
73
79
80 virtual int32 GetSerialNumber(int32 Index) const = 0;
81
83 virtual bool IsValidIndex(int32 Index) const = 0;
84
89 virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const = 0;
90
91 virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const = 0;
92
93 virtual SIZE_T GetAllocatedSize() const = 0;
94
96 virtual bool IsValid(int32 Index) const = 0;
97
100
106
108 virtual int32 ReleaseOne(FMassEntityHandle Handles) = 0;
109
116
121 virtual int32 Num() const = 0;
122
127 virtual int32 ComputeFreeSize() const = 0;
128 };
129
130 //-----------------------------------------------------------------------------
131 // FSingleThreadedEntityStorage
132 //-----------------------------------------------------------------------------
138 {
139 public:
141 virtual FMassArchetypeData* GetArchetype(int32 Index) override;
142 virtual const FMassArchetypeData* GetArchetype(int32 Index) const override;
144 virtual const TSharedPtr<FMassArchetypeData>& GetArchetypeAsShared(int32 Index) const override;
147 virtual EEntityState GetEntityState(int32 Index) const override;
148 virtual int32 GetSerialNumber(int32 Index) const override;
149 virtual bool IsValidIndex(int32 Index) const override;
150 virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const override;
151 virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const override;
152 virtual SIZE_T GetAllocatedSize() const override;
153 virtual bool IsValid(int32 Index) const override;
154 virtual FMassEntityHandle AcquireOne() override;
157 virtual int32 Release(TConstArrayView<FMassEntityHandle> Handles) override;
158 virtual int32 ReleaseOne(FMassEntityHandle Handle) override;
159 virtual int32 ForceRelease(TConstArrayView<FMassEntityHandle> Handles) override;
161 virtual int32 Num() const override;
162 virtual int32 ComputeFreeSize() const override;
163
164 private:
165 struct FEntityData
166 {
167 TSharedPtr<FMassArchetypeData> CurrentArchetype;
168 int32 SerialNumber = 0;
169
170 ~FEntityData();
171 void Reset();
172 bool IsValid() const;
173 };
174
175 std::atomic<int32> NextSerialNumber = 0;
176
178 int32 GenerateSerialNumber()
179 {
180 // The serial number only needs to be unique; it doesn't need to be rolled back if an AutoRTFM transaction fails.
181 return NextSerialNumber.fetch_add(1);
182 }
183
185 TArray<int32> EntityFreeIndexList;
186 };
187
188 //-----------------------------------------------------------------------------
189 // FConcurrentEntityStorage
190 //-----------------------------------------------------------------------------
198 {
199 public:
200
202
203 virtual ~FConcurrentEntityStorage() override;
204
205 virtual FMassArchetypeData* GetArchetype(int32 Index) override;
206 virtual const FMassArchetypeData* GetArchetype(int32 Index) const override;
208 virtual const TSharedPtr<FMassArchetypeData>& GetArchetypeAsShared(int32 Index) const override;
209 virtual void SetArchetypeFromShared(int32 Index, TSharedPtr<FMassArchetypeData>& Archetype) override;
210 virtual void SetArchetypeFromShared(int32 Index, const TSharedPtr<FMassArchetypeData>& Archetype) override;
211 virtual EEntityState GetEntityState(int32 Index) const override;
212 virtual int32 GetSerialNumber(int32 Index) const override;
213 virtual bool IsValidIndex(int32 Index) const override;
214 virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const override;
215 virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const override;
216 virtual SIZE_T GetAllocatedSize() const override;
217 virtual bool IsValid(int32 Index) const override;
218 virtual FMassEntityHandle AcquireOne() override;
221 virtual int32 Release(TConstArrayView<FMassEntityHandle> Handles) override;
222 virtual int32 ReleaseOne(FMassEntityHandle Handle) override;
223 virtual int32 ForceRelease(TConstArrayView<FMassEntityHandle> Handles) override;
225 virtual int32 Num() const override;
226 virtual int32 ComputeFreeSize() const override;
227#if WITH_MASSENTITY_DEBUG
230#endif // WITH_MASSENTITY_DEBUG
231 private:
232
233 struct FEntityData
234 {
235 static constexpr int MaxGenerationBits = 30;
236
237 TSharedPtr<FMassArchetypeData> CurrentArchetype;
239 uint32 GenerationId : MaxGenerationBits = 0;
241 uint32 bIsAllocated : 1 = 0;
242
243 ~FEntityData();
245 int32 GetSerialNumber() const;
246
247 bool operator==(const FEntityData& Other) const;
248 };
249
250 EEntityState GetEntityStateInternal(const FEntityData& EntityData) const;
251
252 FEntityData& LookupEntity(int32 Index);
253 const FEntityData& LookupEntity(int32 Index) const;
254
256 uint64 ComputePageSize() const;
257
261 bool AddPage();
262
264 uint32 EntityCount = 0;
265 uint32 MaximumEntityCountShift = 0;
266 uint32 MaxEntitiesPerPage = 0;
267 uint32 MaxEntitiesPerPageShift = 0;
268 uint32 PageCount = 0;
270 UE::FTransactionallySafeMutex PageAllocateMutex;
272 FEntityData** EntityPages = nullptr;
273
274 TArray<int32> EntityFreeIndexList;
275 UE::FTransactionallySafeMutex FreeListMutex;
276 };
277
278} // namespace UE::Mass
#define UE_AUTORTFM_ALWAYS_OPEN
Definition AutoRTFMDefines.h:114
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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_FORCEINLINE_HINT bool IsValid(const UObject *Test)
Definition Object.h:1875
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition ArrayView.h:139
Definition Array.h:670
Definition ChunkedArray.h:56
Definition SharedPointer.h:692
Definition TVariant.h:48
Definition Mutex.h:18
Definition MassEntityManagerStorage.h:198
virtual int32 Acquire(TArrayView< FMassEntityHandle > OutEntityHandles) override
Definition MassEntityManagerStorage.cpp:474
virtual bool IsValidIndex(int32 Index) const override
Definition MassEntityManagerStorage.cpp:337
virtual int32 GetSerialNumber(int32 Index) const override
Definition MassEntityManagerStorage.cpp:332
virtual int32 ForceReleaseOne(FMassEntityHandle Handle) override
Definition MassEntityManagerStorage.cpp:611
virtual SIZE_T GetAllocatedSize() const override
Definition MassEntityManagerStorage.cpp:365
virtual void SetArchetypeFromShared(int32 Index, TSharedPtr< FMassArchetypeData > &Archetype) override
Definition MassEntityManagerStorage.cpp:299
virtual TSharedPtr< FMassArchetypeData > & GetArchetypeAsShared(int32 Index) override
Definition MassEntityManagerStorage.cpp:289
virtual int32 ComputeFreeSize() const override
Definition MassEntityManagerStorage.cpp:621
virtual ~FConcurrentEntityStorage() override
Definition MassEntityManagerStorage.cpp:265
virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const override
Definition MassEntityManagerStorage.cpp:354
virtual int32 ForceRelease(TConstArrayView< FMassEntityHandle > Handles) override
Definition MassEntityManagerStorage.cpp:583
virtual FMassEntityHandle AcquireOne() override
Definition MassEntityManagerStorage.cpp:444
virtual int32 Num() const override
Definition MassEntityManagerStorage.cpp:616
virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const override
Definition MassEntityManagerStorage.cpp:348
virtual int32 ReleaseOne(FMassEntityHandle Handle) override
Definition MassEntityManagerStorage.cpp:578
virtual FMassArchetypeData * GetArchetype(int32 Index) override
Definition MassEntityManagerStorage.cpp:279
virtual EEntityState GetEntityState(int32 Index) const override
Definition MassEntityManagerStorage.cpp:327
Definition MassEntityManagerStorage.h:138
virtual FMassArchetypeData * GetArchetype(int32 Index) override
Definition MassEntityManagerStorage.cpp:42
virtual int32 Acquire(TArrayView< FMassEntityHandle > OutEntityHandles) override
Definition MassEntityManagerStorage.cpp:132
virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const override
Definition MassEntityManagerStorage.cpp:102
virtual int32 ForceRelease(TConstArrayView< FMassEntityHandle > Handles) override
Definition MassEntityManagerStorage.cpp:198
virtual void SetArchetypeFromShared(int32 Index, TSharedPtr< FMassArchetypeData > &) override
Definition MassEntityManagerStorage.cpp:62
virtual int32 Num() const override
Definition MassEntityManagerStorage.cpp:216
virtual TSharedPtr< FMassArchetypeData > & GetArchetypeAsShared(int32 Index) override
Definition MassEntityManagerStorage.cpp:52
virtual bool IsValidIndex(int32 Index) const override
Definition MassEntityManagerStorage.cpp:91
virtual SIZE_T GetAllocatedSize() const override
Definition MassEntityManagerStorage.cpp:109
virtual FMassEntityHandle AcquireOne() override
Definition MassEntityManagerStorage.cpp:119
virtual int32 ComputeFreeSize() const override
Definition MassEntityManagerStorage.cpp:221
virtual EEntityState GetEntityState(int32 Index) const override
Definition MassEntityManagerStorage.cpp:72
virtual int32 ForceReleaseOne(FMassEntityHandle Handle) override
Definition MassEntityManagerStorage.cpp:211
virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const override
Definition MassEntityManagerStorage.cpp:96
virtual int32 GetSerialNumber(int32 Index) const override
Definition MassEntityManagerStorage.cpp:86
virtual int32 ReleaseOne(FMassEntityHandle Handle) override
Definition MassEntityManagerStorage.cpp:193
Definition MassEntityManagerStorage.h:53
virtual int32 ComputeFreeSize() const =0
virtual int32 Release(TConstArrayView< FMassEntityHandle > Handles)=0
virtual int32 Acquire(TArrayView< FMassEntityHandle > OutEntityHandles)=0
virtual int32 GetSerialNumber(int32 Index) const =0
int32 Acquire(const int32 Count, TArray< FMassEntityHandle > &OutEntityHandles)
Definition MassEntityManagerStorage.cpp:14
virtual EEntityState GetEntityState(int32 Index) const =0
virtual FMassEntityHandle AcquireOne()=0
virtual int32 ForceReleaseOne(FMassEntityHandle Handle)=0
virtual ~IEntityStorageInterface()=default
virtual const TSharedPtr< FMassArchetypeData > & GetArchetypeAsShared(int32 Index) const =0
virtual int32 Num() const =0
virtual int32 ReleaseOne(FMassEntityHandle Handles)=0
virtual bool IsValidHandle(FMassEntityHandle EntityHandle) const =0
virtual bool IsValidIndex(int32 Index) const =0
virtual SIZE_T GetAllocatedSize() const =0
virtual const FMassArchetypeData * GetArchetype(int32 Index) const =0
virtual void SetArchetypeFromShared(int32 Index, TSharedPtr< FMassArchetypeData > &Archetype)=0
virtual void SetArchetypeFromShared(int32 Index, const TSharedPtr< FMassArchetypeData > &Archetype)=0
virtual bool IsValid(int32 Index) const =0
virtual FMassArchetypeData * GetArchetype(int32 Index)=0
virtual int32 ForceRelease(TConstArrayView< FMassEntityHandle > Handles)=0
virtual TSharedPtr< FMassArchetypeData > & GetArchetypeAsShared(int32 Index)=0
EEntityState
Definition MassEntityManagerStorage.h:56
virtual bool IsEntityActive(FMassEntityHandle EntityHandle) const =0
Definition MassArchetypeData.h:21
U16 Index
Definition radfft.cpp:71
Definition MassArchetypeData.h:172
Definition MassEntityHandle.h:13
Definition MassEntityManagerStorage.h:30
uint32 MaxEntitiesPerPage
Definition MassEntityManagerStorage.h:41
uint32 MaxEntityCount
Definition MassEntityManagerStorage.h:35
Definition MassEntityManagerStorage.h:17