UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ObjectReferenceCache.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CoreTypes.h"
10#include "Containers/Map.h"
12#include "UObject/ObjectPtr.h"
13
15
16namespace UE::Net
17{
18 class FStringTokenStore;
19 class FNetTokenStore;
20 class FNetSerializationContext;
21 struct FObjectNetSerializerQuantizedReferenceStorage;
22 namespace Private
23 {
24 class FNetRefHandleManager;
25 class FNetExportContext;
26 struct FPendingBatchHolder;
28 }
29}
30
31namespace UE::Net::Private
32{
33
34// A lot of code in this class is extracted from the re-factored GUIDCache/ClientPackageMap and must be kept up to sync once they are submitted
35// Hopefully we can merge parts of this back together later on
36
38{
39public:
40
42
43 void Init(UReplicationSystem* ReplicationSystem);
44
45 // Determine if the object is dynamic
46 bool IsDynamicObject(const UObject* Object) const;
47
48 // Are we allowed to create new NetHandles to reference objects?
49 bool IsAuthority() const;
50
51 // Create and assign a new NetHandle to the object
53
54 // Create and assign a new pre-registered NetHandle to the object
56
57 // Get existing handle for object
59
60 // Get object from handle, only if the object is in the cache.
62
63 // Get object from handle, only if the object is in the cache and only if it was registered via PreregisterObjectReferenceHandle or AddPreregisteredReference.
65
66 // Try to resolve the object reference and try to load it if the object cannot be found
68
69 UObject* ResolveObjectReference(const FNetObjectReference& ObjectRef, const FNetObjectResolveContext& ResolveContext);
71
72 // Returns true of this NetRefHandle is marked as broken
74
75 // Returns true of the provided NetRefHandle or one of its outers is pending async loading.
76 bool IsNetRefHandlePending(FNetRefHandle NetRefHandle, const FPendingBatchHolder& PendingBatchHolder) const;
77
78 // Returns true of the provided NetRefHandle was assigned via PreRegisterObjectReferenceHandle or AddPreregisteredReference.
79 bool IsNetRefHandlePreRegistered(FNetRefHandle NetRefHandle) const;
80
81 // Find replicated outer
83
84 // Get or create a NetObjectReference from the object
86
87 // Get or create a NetObjectReference from the object identifed by path relative to outer
89
90 // Bind a nethandle and the object reference cache on the client
91 void BindRemoteReference(FNetRefHandle RefHandle, const UObject* Object);
92
93 // Add reference for pre-registered object (client)
94 void AddPreRegisteredReference(FNetRefHandle RefHandle, const UObject* Object);
95
96 // Remove references to dynamic objects
97 void RemoveReference(FNetRefHandle RefHandle, const UObject* Object);
98
99 // Write full chain of object references for RefHandle
101
102 // Read/load full reference data, this will populate the cache on the receiving end, but will not try to resolve the actual objects
104
105 // Write reference, the reference must already be exported
107
108 // Read reference, as written by WriteReference
110
111 // Add exports to the set of pending exports for the current batch being written
113
114 // Add exports to the set of pending exports for the current batch being written
116
117 // Add export to the set of pending exports for the current batch being written
118 void AddPendingExport(FNetExportContext& ExportContext, const FNetObjectReference& Reference) const;
119
120 enum class EWriteExportsResult : unsigned
121 {
122 // We did write exports
124
125 // BitStream overflow.
127
128 // Some error occurred while serializing the object.
129 NoExports,
130 };
131
132 // Exports are expected to be part of the written state, so if the result is a BitStreamOverflow
133 // it is up to the caller to roll back written data and pending exports
135
137
139
140 // Async interface, kept as close to possible to FNetGuidCache/PackageMapClient
142 {
143 UseCVar = 0, // Use CVar (net.AllowAsyncLoading) to determine if we should async load
144 ForceDisable = 1, // Disable async loading
145 ForceEnable = 2, // Force enable async loading
146 };
147
149 bool ShouldAsyncLoad() const;
150
151
152 // While async loading of pending must be mapped references we need to maintain references to already resolved objects as there will be no instance referencing them
157
158 FString DescribeObjectReference(const FNetObjectReference Ref, const FNetObjectResolveContext& ResolveContext);
159
161 const TCHAR* GetObjectRelativePath(FNetRefHandle NetRefHandle) const;
162
163private:
164 void AsyncPackageCallback(const FName& PackageName, UPackage* Package, EAsyncLoadingResult::Type Result);
165 void AsyncPackageForcedFailCallback(const FName& PackageName, UPackage* Package, EAsyncLoadingResult::Type Result);
166
167 struct FCachedNetObjectReference
168 {
170 const UObject* ObjectKey = nullptr;
171
172 // NetRefHandle
173 FNetRefHandle NetRefHandle;
174
175 // RelativePath to outer
176 FNetToken RelativePath;
177
178 // Ref to outer
179 FNetRefHandle OuterNetRefHandle;
180
181 // Flags
182 uint8 bNoLoad : 1 = false; // Don't load this, only do a find
183 uint8 bIgnoreWhenMissing : 1 = false;
184 uint8 bIsPackage : 1 = false;
185 uint8 bIsBroken : 1 = false;
186 uint8 bIsPending : 1 = false;
187 uint8 bIsPreRegistered : 1 = false; // True if assigned via PreregisterObjectReferenceHandle or AddPreregisteredReference
188 };
189
190 struct FQueuedBatchObjectReference
191 {
192 TObjectPtr<const UObject> Object = nullptr;
193 uint32 RefCount = 0U;
194 };
195
196 struct FPendingAsyncLoadRequest
197 {
198 FPendingAsyncLoadRequest(FNetRefHandle InNetRefHandle, double InRequestStartTime);
199 void Merge(const FPendingAsyncLoadRequest& Other);
200 void Merge(FNetRefHandle InNetRefHandle);
201
202 // NetRefHandles that requested loading for the same UPackage
204 double RequestStartTime;
205 };
206
207 bool CreateObjectReferenceInternal(const UObject* Object, FNetObjectReference& OutReference);
208
209
210 void ReadFullReferenceInternal(FNetSerializationContext& Context, FNetObjectReference& OutRef, uint32 RecursionCount);
211 void WriteFullReferenceInternal(FNetSerializationContext& Context, const FNetObjectReference& Ref) const;
212
213 UObject* ResolveObjectReferenceHandleInternal(FNetRefHandle RefHandle, const FNetObjectResolveContext& ResolveContext, bool& bOutMustBeMapped);
214 bool IsDynamicInternal(const UObject* Object) const;
215 bool SupportsObjectInternal(const UObject* Object) const;
216 bool CanClientLoadObjectInternal(const UObject* Object, bool bIsDynamic) const;
217 bool ShouldIgnoreWhenMissing(FNetRefHandle RefHandle) const;
218 bool RenamePathForPie(uint32 ConnectionId, FString& Str, bool bReading);
219
220 // Get the string path of RefHandle
221 FString FullPath(FNetRefHandle RefHandle, const FNetObjectResolveContext& ResolveContext) const;
222 void GenerateFullPath_r(FNetRefHandle RefHandle, const FNetObjectResolveContext& ResolveContext, FString& OutFullPath) const;
223
224 // Find dynamic root
225 FNetRefHandle GetDynamicRoot(const FNetRefHandle Handle) const;
226
227 static FNetObjectReference MakeNetObjectReference(FNetRefHandle RefHandle, FNetToken RelativePath);
228 static FNetObjectReference MakeNetObjectReference(const FCachedNetObjectReference& CachedReference);
229
230 // Must be mapped exports are written for each batch that serializes object references, if async loading is enabled the client
231 // will defer application of data contained in the batch until the must be mapped exports are resolvable.
232 bool WriteMustBeMappedExports(FNetSerializationContext& Context, FInternalNetRefIndex ObjectIndex, TArrayView<const FNetObjectReference> ExportsView) const;
233 void ReadMustBeMappedExports(const FNetRefHandle& NetObjectHandle, FNetSerializationContext& Context, TArray<FNetRefHandle>* MustBeMappedExports, EIrisAsyncLoadingPriority& OutIrisAsyncLoadingPriority);
234
235 void StartAsyncLoadingPackage(FCachedNetObjectReference& Object, FName PackagePath, TAsyncLoadPriority AsyncLoadingPriority, const FNetRefHandle RefHandle, const bool bWasAlreadyAsyncLoading);
236 void ValidateAsyncLoadingPackage(FCachedNetObjectReference& Object, FName PackagePath, const FNetRefHandle RefHandle);
237
238private:
239
240 // Map raw UObject pointer -> Handle
241 // To verify that the reference is valid we need to check the weakpointer stored in the cache
242 TMap<const UObject*, FNetRefHandle> ObjectToNetReferenceHandle;
243
244 // Map ReferenceHandle -> CachedReference
245 TMap<FNetRefHandle, FCachedNetObjectReference> ReferenceHandleToCachedReference;
246
247 // To properly clean up stale references referencing dynamic objects we need to track them
248 TMultiMap<FNetRefHandle, FNetRefHandle> HandleToDynamicOuter;
249
250 UReplicationSystem* ReplicationSystem;
251 UObjectReplicationBridge* ReplicationBridge;
252 FNetTokenStore* NetTokenStore;
253 FStringTokenStore* StringTokenStore;
254 FNetRefHandleManager* NetRefHandleManager;
255
256 // Do we have authority to create references?
257 uint32 bIsAuthority : 1;
258
265 TMap<FNetRefHandle, FQueuedBatchObjectReference> QueuedBatchObjectReferences;
266
267 EAsyncLoadMode AsyncLoadMode;
268 bool bCachedCVarAllowAsyncLoading;
269
271 TMap<FName, FPendingAsyncLoadRequest> PendingAsyncLoadRequests;
272
273 // $TODO: $IRIS: Stats support
274#if 0
276 //TArray<FNetRefHandle> SyncLoadedGUIDs;
277 //FNetAsyncLoadDelinquencyAnalytics DelinquentAsyncLoads;
278 //void ConsumeAsyncLoadDelinquencyAnalytics(FNetAsyncLoadDelinquencyAnalytics& Out);
279 //const FNetAsyncLoadDelinquencyAnalytics& GetAsyncLoadDelinquencyAnalytics() const;
280 //void ResetAsyncLoadDelinquencyAnalytics();
281 //bool WasGUIDSyncLoaded(FNetworkGUID NetGUID) const { return SyncLoadedGUIDs.Contains(NetGUID); }
282 //void ClearSyncLoadedGUID(FNetworkGUID NetGUID) { SyncLoadedGUIDs.Remove(NetGUID); }
287 //void ReportSyncLoadedGUIDs();
288#endif
289
290};
291
293{
294 bool bMustBeMapped;
295 return ResolveObjectReferenceHandleInternal(RefHandle, ResolveContext, bMustBeMapped);
296}
297
299{
300 UObject* ResolvedObject = nullptr;
301 ResolveObjectReference(ObjectRef, ResolveContext, ResolvedObject);
302 return ResolvedObject;
303}
304
309
311{
313 return FNetObjectReference(RefHandle, RelativePath, Traits);
314}
315
317{
319 return FNetObjectReference(CachedReference.NetRefHandle, FNetToken(), Traits);
320}
321
322}
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void Init()
Definition LockFreeList.h:4
EIrisAsyncLoadingPriority
Definition ObjectReferenceTypes.h:14
int32 TAsyncLoadPriority
Definition UObjectGlobals.h:726
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition NameTypes.h:617
Definition UObjectGlobals.h:2492
Definition ArrayView.h:139
Definition Array.h:670
Definition UnrealString.h.inl:34
Definition NetObjectReference.h:38
bool IsValid() const
Definition NetObjectReference.h:43
Definition NetRefHandle.h:25
Definition NetSerializationContext.h:31
Definition NetToken.h:22
Definition NetExportContext.h:17
Definition ObjectReferenceCache.h:38
const TCHAR * GetObjectRelativePath(FNetRefHandle NetRefHandle) const
Definition ObjectReferenceCache.cpp:2306
EWriteExportsResult WritePendingExports(FNetSerializationContext &Context, FInternalNetRefIndex ObjectIndex)
Definition ObjectReferenceCache.cpp:1701
FNetRefHandle CreateObjectReferenceHandle(const UObject *Object)
Definition ObjectReferenceCache.cpp:252
void AddTrackedQueuedBatchObjectReference(const FNetRefHandle InHandle, const UObject *InObject)
Definition ObjectReferenceCache.cpp:2278
UObject * ResolveObjectReferenceHandle(FNetRefHandle RefHandle, const FNetObjectResolveContext &ResolveContext)
Definition ObjectReferenceCache.h:292
void RemoveReference(FNetRefHandle RefHandle, const UObject *Object)
Definition ObjectReferenceCache.cpp:593
FObjectReferenceCache()
Definition ObjectReferenceCache.cpp:114
void UpdateTrackedQueuedBatchObjectReference(const FNetRefHandle InHandle, const UObject *NewObject)
Definition ObjectReferenceCache.cpp:2285
void ReadFullReference(FNetSerializationContext &Context, FNetObjectReference &OutRef)
Definition ObjectReferenceCache.cpp:1474
bool IsAuthority() const
Definition ObjectReferenceCache.cpp:170
EAsyncLoadMode
Definition ObjectReferenceCache.h:142
bool IsNetRefHandlePreRegistered(FNetRefHandle NetRefHandle) const
Definition ObjectReferenceCache.cpp:730
bool ReadExports(const FNetRefHandle &NetObjectHandle, FNetSerializationContext &Context, TArray< FNetRefHandle > *MustBeMappedExports, EIrisAsyncLoadingPriority &OutIrisAsyncLoadingPriority)
Definition ObjectReferenceCache.cpp:1792
FString DescribeObjectReference(const FNetObjectReference Ref, const FNetObjectResolveContext &ResolveContext)
Definition ObjectReferenceCache.cpp:1943
FNetRefHandle PreRegisterObjectReferenceHandle(const UObject *Object)
Definition ObjectReferenceCache.cpp:260
void AddPendingExport(FNetExportContext &ExportContext, const FNetObjectReference &Reference) const
Definition ObjectReferenceCache.cpp:1662
void BindRemoteReference(FNetRefHandle RefHandle, const UObject *Object)
Definition ObjectReferenceCache.cpp:518
UObject * GetPreRegisteredObjectFromReferenceHandle(FNetRefHandle RefHandle)
Definition ObjectReferenceCache.cpp:715
void SetAsyncLoadMode(const EAsyncLoadMode NewMode)
Definition ObjectReferenceCache.cpp:2228
FNetObjectReference GetReplicatedOuter(const FNetObjectReference &Reference) const
Definition ObjectReferenceCache.cpp:1202
void AddPreRegisteredReference(FNetRefHandle RefHandle, const UObject *Object)
Definition ObjectReferenceCache.cpp:572
void AddPendingExports(FNetSerializationContext &Context, TArrayView< const FNetObjectReference > ExportsView) const
Definition ObjectReferenceCache.cpp:1674
bool IsDynamicObject(const UObject *Object) const
Definition ObjectReferenceCache.cpp:155
void ReadReference(FNetSerializationContext &Context, FNetObjectReference &OutRef)
Definition ObjectReferenceCache.cpp:1600
UObject * GetObjectFromReferenceHandle(FNetRefHandle RefHandle)
Definition ObjectReferenceCache.cpp:706
bool IsNetRefHandlePending(FNetRefHandle NetRefHandle, const FPendingBatchHolder &PendingBatchHolder) const
Definition ObjectReferenceCache.cpp:736
UObject * ResolveObjectReference(const FNetObjectReference &ObjectRef, const FNetObjectResolveContext &ResolveContext)
Definition ObjectReferenceCache.h:298
static FNetObjectReference MakeNetObjectReference(FNetRefHandle Handle)
Definition ObjectReferenceCache.h:305
EWriteExportsResult
Definition ObjectReferenceCache.h:121
FNetObjectReference GetOrCreateObjectReference(const UObject *Instance)
Definition ObjectReferenceCache.cpp:1244
FNetRefHandle GetObjectReferenceHandleFromObject(const UObject *Object, EGetRefHandleFlags GetRefHandleFlags=EGetRefHandleFlags::None) const
Definition ObjectReferenceCache.cpp:478
bool IsNetRefHandleBroken(FNetRefHandle Handle, bool bMustBeRegistered) const
Definition ObjectReferenceCache.cpp:724
void AddReferencedObjects(FReferenceCollector &ReferenceCollector)
Definition ObjectReferenceCache.cpp:2259
void RemoveTrackedQueuedBatchObjectReference(const FNetRefHandle InHandle)
Definition ObjectReferenceCache.cpp:2293
bool ShouldAsyncLoad() const
Definition ObjectReferenceCache.cpp:2237
void WriteFullReference(FNetSerializationContext &Context, FNetObjectReference Ref) const
Definition ObjectReferenceCache.cpp:1527
void WriteReference(FNetSerializationContext &Context, FNetObjectReference Ref) const
Definition ObjectReferenceCache.cpp:1560
Definition ObjectReplicationBridge.h:83
Definition Object.h:95
Definition Package.h:216
Definition ReplicationSystem.h:70
Type
Definition UObjectGlobals.h:694
Definition OverriddenPropertySet.cpp:45
Definition NetworkVersion.cpp:28
uint32 FInternalNetRefIndex
Definition ReplicationStateStorage.h:20
Definition NetworkVersion.cpp:28
ENetObjectReferenceResolveResult
Definition NetObjectReference.h:110
ENetObjectReferenceTraits
Definition NetObjectReference.h:24
EGetRefHandleFlags
Definition ReplicationSystemTypes.h:19
Definition ObjectPtr.h:488
Definition WeakObjectPtrTemplates.h:25
Definition ObjectReferenceCacheFwd.h:30
Definition PendingBatchData.h:74