UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
ReliableNetBlobQueue.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4#include "CoreTypes.h"
8
9namespace UE::Net
10{
11 class FNetBlob;
12 class FNetSerializationContext;
13 struct FReplicationStateDescriptor;
14 namespace Private
15 {
16 class FNetBlobHandlerManager;
17 }
18}
19
20namespace UE::Net::Private
21{
22
25{
26public:
27 // A single ReplicationRecord supports up to four disjoint sequences to be serialized in a packet. This allows for resends of dropped data while potentially also writing new blobs for the first time.
29 {
30 struct FSequence
31 {
32 enum : unsigned
33 {
36 };
37
38 FSequence() = default;
40 {
41 Number = Value & ((1U << NumberBitCount) - 1U);
43 }
44
46 {
47 return static_cast<uint16>((Count << NumberBitCount) | Number);
48 }
49
52 };
53
54 FReplicationRecord() = default;
56 {
57 for (unsigned Index : {3U, 2U, 1U, 0U})
58 {
59 Sequences[Index] = FSequence(Value & 0xFFFFU);
60 Value >>= 16U;
61 }
62 }
63
65 {
66 uint64 Value = 0;
67 for (unsigned Index : {0U, 1U, 2U, 3U})
68 {
69 Value = (Value << 16U) | Sequences[Index].ToUint16();
70 }
71
72 return Value;
73 }
74
75 bool IsValid() const { return (Sequences[0].Count | Sequences[1].Count | Sequences[2].Count | Sequences[3].Count) != 0U; }
76
78 };
79
83 static constexpr uint32 MaxUnackedBlobCount = 1024U;
84
87
89 uint32 GetUnsentBlobCount() const { return UnsentBlobCount; }
90
92 bool HasUnsentBlobs() const { return GetUnsentBlobCount() > 0; }
93
95 bool IsAllSentAndAcked() const { return FirstSeq == LastSeq && GetUnsentBlobCount() == 0; }
96
98 bool IsSendWindowFull() const;
99
101 IRISCORE_API bool IsSafeToDestroy() const;
102
105
108
110 IRISCORE_API void Pop();
111
114
117
120
131
138
146
153
159
168
169private:
170 enum Constants : uint32
171 {
172 IndexBitCount = 10U,
173 MaxWriteSequenceCount = UE_ARRAY_COUNT(FReplicationRecord::Sequences),
174 MaxSequenceLength = (1U << FReplicationRecord::FSequence::CountBitCount) - 1U,
175 };
176
177 uint32 SequenceToIndex(uint32 Seq) const;
178
179 bool IsSequenceAcked(uint32 Seq) const;
180 bool IsIndexAcked(uint32 Index) const;
181 void SetIndexIsAcked(uint32 Index);
182 void SetSequenceIsAcked(uint32 Index);
183 void ClearIndexIsAcked(uint32 Index);
184
185 bool IsSequenceSent(uint32 Seq) const;
186 bool IsIndexSent(uint32 Index) const;
187 void SetIndexIsSent(uint32 Index);
188 void SetSequenceIsSent(uint32 Index);
189 void ClearSequenceIsSent(uint32 Seq);
190 void ClearIndexIsSent(uint32 Seq);
191
192 bool IsValidReceiveSequence(uint32 Seq) const;
193
194 uint32 SerializeInternal(FNetSerializationContext& Context, FNetRefHandle RefHandle, FReliableNetBlobQueue::FReplicationRecord& OutRecord, const bool bSerializeWithObject);
195 uint32 DeserializeInternal(FNetSerializationContext& Context, FNetRefHandle RefHandle, const bool bSerializeWithObject);
196
197 void OnPacketDelivered(const FReplicationRecord& Record);
198 void OnPacketDropped(const FReplicationRecord& Record);
199
200 void PopInOrderAckedBlobs();
201
203 uint32 Sent[(MaxUnackedBlobCount + 31)/32];
204 uint32 Acked[(MaxUnackedBlobCount + 31)/32];
205 uint32 FirstSeq;
206 uint32 LastSeq;
207 uint32 UnsentBlobCount;
208};
209
210//
212{
213 return (LastSeq - FirstSeq) >= MaxUnackedBlobCount;
214}
215
216inline uint32 FReliableNetBlobQueue::SequenceToIndex(uint32 Seq) const
217{
218 return Seq % MaxUnackedBlobCount;
219}
220
221inline bool FReliableNetBlobQueue::IsIndexAcked(uint32 Index) const
222{
223 return (Acked[Index >> 5U] & (1U << (Index & 31U))) != 0U;
224}
225
226inline bool FReliableNetBlobQueue::IsSequenceAcked(uint32 Seq) const
227{
228 return IsIndexAcked(SequenceToIndex(Seq));
229}
230
231inline void FReliableNetBlobQueue::SetIndexIsAcked(uint32 Index)
232{
233 Acked[Index >> 5U] |= (1U << (Index & 31U));
234}
235
236inline void FReliableNetBlobQueue::SetSequenceIsAcked(uint32 Seq)
237{
238 return SetIndexIsAcked(SequenceToIndex(Seq));
239}
240
241inline void FReliableNetBlobQueue::ClearIndexIsAcked(uint32 Index)
242{
243 Acked[Index >> 5U] &= ~(1U << (Index & 31U));
244}
245
246inline bool FReliableNetBlobQueue::IsIndexSent(uint32 Index) const
247{
248 return (Sent[Index >> 5U] & (1U << (Index & 31U))) != 0U;
249}
250
251inline bool FReliableNetBlobQueue::IsSequenceSent(uint32 Seq) const
252{
253 return IsIndexSent(SequenceToIndex(Seq));
254}
255
256inline void FReliableNetBlobQueue::SetIndexIsSent(uint32 Index)
257{
258 Sent[Index >> 5U] |= (1U << (Index & 31U));
259}
260
261inline void FReliableNetBlobQueue::SetSequenceIsSent(uint32 Seq)
262{
263 return SetIndexIsSent(SequenceToIndex(Seq));
264}
265
266inline void FReliableNetBlobQueue::ClearIndexIsSent(uint32 Index)
267{
268 Sent[Index >> 5U] &= ~(1U << (Index & 31U));
269}
270
271inline void FReliableNetBlobQueue::ClearSequenceIsSent(uint32 Seq)
272{
273 return ClearIndexIsSent(SequenceToIndex(Seq));
274}
275
276inline bool FReliableNetBlobQueue::IsValidReceiveSequence(uint32 Seq) const
277{
278 return (Seq >= FirstSeq) & (Seq - FirstSeq < MaxUnackedBlobCount); // Must be less than MaxUnackedBlobCount as LastSeq == Seq + 1
279}
280
281}
FPlatformTypes::SIZE_T SIZE_T
An unsigned integer the same size as a pointer, the same as UPTRINT.
Definition Platform.h:1150
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
#define UE_ARRAY_COUNT(array)
Definition UnrealTemplate.h:212
uint16_t uint16
Definition binka_ue_file_header.h:7
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Array.h:670
Definition RefCounting.h:454
Definition NetRefHandle.h:25
Definition NetSerializationContext.h:31
Definition ReliableNetBlobQueue.h:25
FReliableNetBlobQueue()
Definition ReliableNetBlobQueue.cpp:25
IRISCORE_API void DropUnreliable()
Definition ReliableNetBlobQueue.cpp:238
IRISCORE_API uint32 Deserialize(FNetSerializationContext &Context)
Definition ReliableNetBlobQueue.cpp:253
IRISCORE_API void ProcessPacketDeliveryStatus(EPacketDeliveryStatus Status, const FReplicationRecord &Record)
Definition ReliableNetBlobQueue.cpp:425
IRISCORE_API void CommitReplicationRecord(const FReplicationRecord &Record)
Definition ReliableNetBlobQueue.cpp:197
IRISCORE_API uint32 DeserializeWithObject(FNetSerializationContext &Context, FNetRefHandle RefHandle)
Definition ReliableNetBlobQueue.cpp:259
uint32 GetUnsentBlobCount() const
Definition ReliableNetBlobQueue.h:89
IRISCORE_API const TRefCountPtr< FNetBlob > * Peek()
Definition ReliableNetBlobQueue.cpp:363
IRISCORE_API bool IsSafeToDestroy() const
Definition ReliableNetBlobQueue.cpp:43
IRISCORE_API bool Enqueue(const TRefCountPtr< FNetBlob > &Blob)
Definition ReliableNetBlobQueue.cpp:347
IRISCORE_API SIZE_T GetUnreliableCount() const
Definition ReliableNetBlobQueue.cpp:221
IRISCORE_API uint32 SerializeWithObject(FNetSerializationContext &Context, FNetRefHandle RefHandle, FReplicationRecord &OutRecord)
Definition ReliableNetBlobQueue.cpp:65
static constexpr uint32 MaxUnackedBlobCount
Definition ReliableNetBlobQueue.h:83
bool IsSendWindowFull() const
Definition ReliableNetBlobQueue.h:211
bool IsAllSentAndAcked() const
Definition ReliableNetBlobQueue.h:95
~FReliableNetBlobQueue()
Definition ReliableNetBlobQueue.cpp:38
IRISCORE_API void Pop()
Definition ReliableNetBlobQueue.cpp:385
IRISCORE_API void DequeueUnreliable(TArray< TRefCountPtr< FNetBlob > > &Unreliable)
Definition ReliableNetBlobQueue.cpp:397
bool HasUnsentBlobs() const
Definition ReliableNetBlobQueue.h:92
Definition ReplicationRecord.h:13
Definition OverriddenPropertySet.cpp:45
Definition NetworkVersion.cpp:28
Definition NetworkVersion.cpp:28
EPacketDeliveryStatus
Definition PacketNotification.h:12
U16 Index
Definition radfft.cpp:71
FSequence(uint16 Value)
Definition ReliableNetBlobQueue.h:39
uint16 ToUint16() const
Definition ReliableNetBlobQueue.h:45
uint64 ToUint64() const
Definition ReliableNetBlobQueue.h:64
FReplicationRecord(uint64 Value)
Definition ReliableNetBlobQueue.h:55
bool IsValid() const
Definition ReliableNetBlobQueue.h:75
FSequence Sequences[4]
Definition ReliableNetBlobQueue.h:77