UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
NetObjectGridFilter.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
6#include "Iris/IrisConfig.h"
9#include "Math/Vector.h"
11#include "NetObjectGridFilter.generated.h"
12
13namespace UE::Net
14{
16 class FWorldLocations;
17 struct FRepTagFindInfo;
18}
19
24USTRUCT()
26{
28
29
30 UPROPERTY()
31 FName FilterProfileName;
32
34 UPROPERTY()
35 uint16 FrameCountBeforeCulling = 4;
36
37 bool operator==(FName Key) const { return FilterProfileName == Key; }
38};
39
43UCLASS(transient, config=Engine, MinimalAPI)
45{
47
48public:
53 UPROPERTY(Config)
54 uint32 ViewPosRelevancyFrameCount = 2;
55
56 UPROPERTY(Config)
57 uint16 DefaultFrameCountBeforeCulling = 4;
58
59 UPROPERTY(Config)
60 float CellSizeX = 20000.0f;
61
62 UPROPERTY(Config)
63 float CellSizeY = 20000.0f;
64
66 UPROPERTY(Config)
67 float DefaultCullDistance = 15000.0f;
68
73 UPROPERTY(Config)
74 bool bUseExactCullDistance = true;
75
77 UPROPERTY(Config)
79};
80
83{
85
86protected:
87 // UNetObjectFilter interface
88 IRISCORE_API virtual void OnInit(const FNetObjectFilterInitParams&) override;
89 IRISCORE_API virtual void OnDeinit() override;
90 IRISCORE_API virtual void OnMaxInternalNetRefIndexIncreased(uint32 NewMaxInternalIndex) override;
91 IRISCORE_API virtual void AddConnection(uint32 ConnectionId) override;
92 IRISCORE_API virtual void RemoveConnection(uint32 ConnectionId) override;
93 IRISCORE_API virtual bool AddObject(uint32 ObjectIndex, FNetObjectFilterAddObjectParams&) override;
94 IRISCORE_API virtual void RemoveObject(uint32 ObjectIndex, const FNetObjectFilteringInfo&) override;
96 IRISCORE_API virtual void Filter(FNetObjectFilteringParams&) override;
98 IRISCORE_API virtual FString PrintDebugInfoForObject(const FDebugInfoParams& Params, uint32 ObjectIndex) const override;
99
100protected:
102 {
103 bool IsUsingWorldLocations() const { return GetLocationStateIndex() == InvalidStateIndex; }
104 bool IsUsingLocationInState() const { return GetLocationStateIndex() != InvalidStateIndex; }
105
115 uint16 GetLocationStateOffset() const { return Data[0]; }
116
118 uint16 GetLocationStateIndex() const { return Data[1]; }
119
120 void SetInfoIndex(uint32 Index) { Data[2] = Index & 65535U; Data[3] = Index >> 16U; }
121 uint32 GetInfoIndex() const { return (uint32(Data[3]) << 16U) | uint32(Data[2]); }
122 };
123
124 IRISCORE_API bool AddCellInfoForObject(const FObjectLocationInfo& ObjectInfo, const UE::Net::FReplicationInstanceProtocol* InstanceProtocol);
125 IRISCORE_API void RemoveCellInfoForObject(const FObjectLocationInfo& ObjectInfo);
126 IRISCORE_API void UpdateCellInfoForObject(const FObjectLocationInfo& ObjectInfo, const UE::Net::FReplicationInstanceProtocol* InstanceProtocol);
127
128protected:
129
130 enum : unsigned
131 {
132 ObjectInfosChunkSize = 64 * 1024,
133 InvalidStateIndex = 65535U,
134 InvalidStateOffset = 65535U,
135 };
136
137 struct FCellBox
138 {
139 int32 MinX = 0;
140 int32 MaxX = -1;
141 int32 MinY = 0;
142 int32 MaxY = -1;
143
144 bool operator==(const FCellBox&) const;
145 bool operator!=(const FCellBox&) const;
146 };
147
148 // We can't fit all info we need in 4x16bits.
150 {
153 uint32 ObjectIndex = 0U;
154 uint16 FrameCountBeforeCulling = 0U;
155
156 float GetCullDistance() const
157 {
158 return CullDistance;
159 }
160
161 float GetCullDistanceSq() const
162 {
163 return CullDistanceSq;
164 }
165
167 {
168 CullDistance = Distance;
169 CullDistanceSq = Distance * Distance;
170 }
171
172 void SetCullDistanceSq(float DistanceSq)
173 {
174 CullDistance = FPlatformMath::Sqrt(DistanceSq);
175 CullDistanceSq = DistanceSq;
176 }
177
178 private:
179 float CullDistance = 0.0f;
180 float CullDistanceSq = 0.0f;
181 };
182
185
187 virtual bool BuildObjectInfo(uint32 ObjectIndex, FNetObjectFilterAddObjectParams& Params) { return false; }
188
190 virtual void OnObjectRemoved(uint32 ObjectIndex) {}
191
192private:
193
194 struct FCellCoord
195 {
196 int32 X;
197 int32 Y;
198
199 private:
200 friend bool operator==(const FCellCoord& A, const FCellCoord& B)
201 {
202 return (A.X == B.X) & (A.Y == B.Y);
203 }
204
205 friend uint32 GetTypeHash(const FCellCoord& Coords)
206 {
207 return ::GetTypeHash((uint64(uint32(Coords.X)) << 32U) | uint64(uint32(Coords.Y)));
208 }
209 };
210
211 struct FCellObjects
212 {
213 TSet<uint32> ObjectIndices;
214 };
215
216 struct FCellAndTimestamp
217 {
218 FCellCoord Cell;
220
221 private:
222 friend bool operator==(const FCellAndTimestamp& A, const FCellAndTimestamp& B)
223 {
224 return (A.Cell == B.Cell) & (A.Timestamp == B.Timestamp);
225 }
226 };
227
228 struct FPerConnectionInfo
229 {
230 // We don't expect a lot of view positions from a single connection
232
233 // Objects that have been recently visible to the connection and the frame countdown.
234 TMap<uint32, uint16> RecentObjectFrameCount;
235 };
236
238 struct FNetGridFilterStats
239 {
240 FNetGridFilterStats() = default;
241
242 void Reset() { *this = FNetGridFilterStats(); }
243
245 uint64 CullTestingTimeInCycles = 0;
246 uint32 CullTestedObjects = 0;
247 };
248
249private:
250 uint32 AllocObjectInfo();
251 void FreeObjectInfo(uint32 Index);
252
253 void UpdatePositionAndCullDistance(const FObjectLocationInfo& ObjectLocationInfo, FPerObjectInfo& PerObjectInfo, const UE::Net::FReplicationInstanceProtocol* InstanceProtocol);
254 void CalculateCellBox(const FPerObjectInfo& PerObjectInfo, FCellBox& OutCellBox);
255 void CalculateCellCoord(FCellCoord& OutCoord, const FVector& Pos);
256
257 uint16 GetFrameCountBeforeCulling(FName ProfileName) const;
258
259 static bool AreCellsDisjoint(const FCellBox& A, const FCellBox& B);
260 static bool DoesCellContainCoord(const FCellBox& Cell, const FCellCoord& Coord);
261
263 TArray<FPerConnectionInfo> PerConnectionInfos;
265 UE::Net::FNetBitArray AssignedObjectInfoIndices;
266
267#if UE_NET_IRIS_CSV_STATS
268 FNetGridFilterStats Stats;
269#endif
270
272 uint32 FrameIndex = 0;
273
274 struct FDebugUpdateCellInfo
275 {
276 FCellCoord Coord;
277 FCellBox NewCellBox;
278 FCellBox PrevCellBox;
279 SIZE_T CellsSize;
280 FVector ObjectPosition;
281 float ObjectCullDistance;
282 };
283
284 // Cached state from UpdateCellInfoForObject().
285 FDebugUpdateCellInfo DebugUpdateCellInfo;
286
288 FVector MinWorldPos;
289 FVector MaxWorldPos;
290 float MaxNetCullDistance = 0.f;
291};
292
298UCLASS(transient, MinimalAPI)
300{
302
303protected:
304 IRISCORE_API virtual void OnInit(const FNetObjectFilterInitParams&) override;
305 IRISCORE_API virtual void OnDeinit() override;
308 IRISCORE_API virtual bool BuildObjectInfo(uint32 ObjectIndex, FNetObjectFilterAddObjectParams& Params) override;
309
310private:
311
312 const UE::Net::FWorldLocations* WorldLocations = nullptr;
313};
314
315
316//
318{
319 return (MinX == Other.MinX) & (MinY == Other.MinY) & (MaxX == Other.MaxX) & (MaxY == Other.MaxY);
320}
321
323{
324 return (MinX != Other.MinX) | (MinY != Other.MinY) | (MaxX != Other.MaxX) | (MaxY != Other.MaxY);
325}
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
return true
Definition ExternalRpcRegistry.cpp:601
#define X(Name, Desc)
Definition FormatStringSan.h:47
UE_FORCEINLINE_HINT bool operator!=(const FIndexedPointer &Other) const
Definition LockFreeList.h:76
#define UPROPERTY(...)
UObject definition macros.
Definition ObjectMacros.h:744
#define GENERATED_BODY(...)
Definition ObjectMacros.h:765
#define UCLASS(...)
Definition ObjectMacros.h:776
#define USTRUCT(...)
Definition ObjectMacros.h:746
uint32 Offset
Definition VulkanMemory.cpp:4033
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Engine.Build.cs:7
Definition NameTypes.h:617
Definition Array.h:670
Definition ChunkedArray.h:56
Definition UnrealString.h.inl:34
Definition StrongObjectPtrTemplates.h:26
Definition NetBitArray.h:74
Definition WorldLocations.h:57
Definition NetObjectFilter.h:121
Definition NetObjectFilter.h:178
Definition NetObjectGridFilter.h:45
Definition NetObjectGridFilter.h:83
virtual void UpdateObjectInfo(FPerObjectInfo &PerObjectInfo, const FObjectLocationInfo &ObjectLocationInfo, const UE::Net::FReplicationInstanceProtocol *InstanceProtocol)
Definition NetObjectGridFilter.h:184
virtual void OnObjectRemoved(uint32 ObjectIndex)
Definition NetObjectGridFilter.h:190
virtual bool BuildObjectInfo(uint32 ObjectIndex, FNetObjectFilterAddObjectParams &Params)
Definition NetObjectGridFilter.h:187
Definition NetObjectGridFilter.h:300
uint32 GetTypeHash(const FKey &Key)
Definition BlackboardKey.h:35
bool operator==(const FCachedAssetKey &A, const FCachedAssetKey &B)
Definition AssetDataMap.h:501
Definition NetworkVersion.cpp:28
@ Config
Property should be loaded/saved to ini file as permanent profile.
Definition ObjectMacros.h:1053
U16 Index
Definition radfft.cpp:71
Definition NetObjectFilter.h:143
Definition NetObjectFilter.h:129
Definition NetObjectFilter.h:101
Definition NetObjectFilter.h:52
Definition NetObjectGridFilter.h:26
Definition NetObjectFilter.h:93
Definition NetObjectFilter.h:81
static CORE_API const TVector< double > ZeroVector
Definition Vector.h:79
Definition ReplicationProtocol.h:42
Definition NetObjectFilter.h:227
Definition NetObjectGridFilter.h:138
int32 MaxY
Definition NetObjectGridFilter.h:142
int32 MaxX
Definition NetObjectGridFilter.h:140
int32 MinX
Definition NetObjectGridFilter.h:139
int32 MinY
Definition NetObjectGridFilter.h:141
bool operator==(const FCellBox &) const
Definition NetObjectGridFilter.h:317
bool operator!=(const FCellBox &) const
Definition NetObjectGridFilter.h:322
Definition NetObjectGridFilter.h:102
bool IsUsingLocationInState() const
Definition NetObjectGridFilter.h:104
void SetLocationStateOffset(uint16 Offset)
Definition NetObjectGridFilter.h:114
bool IsUsingWorldLocations() const
Definition NetObjectGridFilter.h:103
uint16 GetLocationStateIndex() const
Definition NetObjectGridFilter.h:118
void SetInfoIndex(uint32 Index)
Definition NetObjectGridFilter.h:120
void SetLocationStateIndex(uint16 Index)
Definition NetObjectGridFilter.h:117
uint32 GetInfoIndex() const
Definition NetObjectGridFilter.h:121
uint16 GetLocationStateOffset() const
Definition NetObjectGridFilter.h:115
Definition NetObjectGridFilter.h:150
float GetCullDistance() const
Definition NetObjectGridFilter.h:156
FCellBox CellBox
Definition NetObjectGridFilter.h:152
float GetCullDistanceSq() const
Definition NetObjectGridFilter.h:161
void SetCullDistanceSq(float DistanceSq)
Definition NetObjectGridFilter.h:172
void SetCullDistance(float Distance)
Definition NetObjectGridFilter.h:166