UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
FastArrayReplicationFragment.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
12
14
16
17namespace UE::Net
18{
19
26template <typename FastArrayItemType, typename FastArrayType>
28{
29public:
32
33protected:
36
37 // For the select few cases where we allow additional properties, this is a helper to deal with applying them directly from quantized state
39
40 // FReplicationFragment
45
46protected:
47 // Poll entire FastFrray
48 bool PollAllState(bool bForceFullCompare = false);
49
50 // Returns true if the FastArray is dirty
51 bool IsDirty() const;
52
53 // Returns true if the FastArray should be polled
54 bool IsDirtyForPolling() const;
55
56 // Mark FastArray dirty
57 void MarkDirty();
58
59 // Get FastArraySerializer from owner
60 inline FastArrayType* GetFastArraySerializerFromOwner() const;
61
62 // Get FastArraySerializer from our cached ReplicationState
63 inline FastArrayType* GetFastArraySerializerFromReplicationState() const;
64
65 // Get FastArraySerialzier from received state
67
68 // TODO: Can be removed when we have implemented explicit code to traverse quantized data directly
70};
71
80template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType = FastArrayPollingPolicies::FNoPollingPolicy>
82{
83public:
85
88
89protected:
90 // FReplicationFragment implementation
95
96protected:
97 bool PollAllState();
98
99 bool IsDirty() const;
100
101 // Get FastArraySerializer from owner
102 inline FastArrayType* GetFastArraySerializerFromOwner() const;
103
104private:
105 PollingPolicyType PollingPolicy;
106};
107
112template <typename FastArrayItemType, typename FastArrayType>
120
121template <typename FastArrayItemType, typename FastArrayType>
123{
124 // Get the wrapped FastArraySerializer and array
125 FastArrayType* DstArraySerializer = GetFastArraySerializerFromOwner();
126 ItemArrayType* DstWrappedArray = reinterpret_cast<ItemArrayType*>(reinterpret_cast<uint8*>(DstArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
127
128 // For now we maintain a dequantized representation of the array into which we accumulate new data.
129 // TODO: change to only maintain the map of indices
130 InternalPartialDequantizeFastArray(Context, reinterpret_cast<uint8*>(AccumulatedReceivedState.Get()), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
131
132 // Intentionally not const as we allow the src state to be modified
133 FastArrayType* SrcArraySerializer = AccumulatedReceivedState.Get();
134 const ItemArrayType* SrcWrappedArray = reinterpret_cast<const ItemArrayType*>(reinterpret_cast<uint8*>(SrcArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
135
136 // Apply state to target FastArray and issue callbacks
138}
139
140template <typename FastArrayItemType, typename FastArrayType>
142{
143 // Dequantize additional properties directly to DstArraySerialzier
144 InternalDequantizeExtraProperties(*Context.NetSerializationContext, reinterpret_cast<uint8*>(GetFastArraySerializerFromOwner()), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
145}
146
147template <typename FastArrayItemType, typename FastArrayType>
149{
150 return reinterpret_cast<FastArrayType*>(reinterpret_cast<uint8*>(Owner) + ReplicationStateDescriptor->MemberProperties[0]->GetOffset_ForGC());
151}
152
153template <typename FastArrayItemType, typename FastArrayType>
155{
156 return reinterpret_cast<FastArrayType*>(Context.StateBufferData.ExternalStateBuffer + ReplicationStateDescriptor->MemberDescriptors[0].ExternalMemberOffset);
157}
158
159template <typename FastArrayItemType, typename FastArrayType>
161{
162 checkSlow(ReplicationState);
163 return ReplicationState ? reinterpret_cast<FastArrayType*>(ReplicationState->GetStateBuffer() + ReplicationStateDescriptor->MemberDescriptors[0].ExternalMemberOffset) : nullptr;
164}
165
166template <typename FastArrayItemType, typename FastArrayType>
168{
169 // If the ForceObjectReferences flag is set we cannot early out and must always refresh cached data
171 {
172 constexpr bool bForceFullCompare = true;
174 }
175
176 // We can early out if we are pushbased and not dirty for polling
179
180 if (bPoll)
181 {
182 constexpr bool bForceFullCompare = false;
184 }
185 else
186 {
187 return IsDirty();
188 }
189}
190
191template <typename FastArrayItemType, typename FastArrayType>
193{
194 // Lookup source data, we need the actual FastArraySerializer and the Array it is wrapping
195 FastArrayType* SrcArraySerializer = GetFastArraySerializerFromOwner();
196 ItemArrayType* SrcWrappedArray = reinterpret_cast<ItemArrayType*>(reinterpret_cast<uint8*>(SrcArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
197
198 IRIS_PROFILER_PROTOCOL_NAME(ReplicationStateDescriptor->DebugName->Name);
199
200 // Lookup destination data
201 FastArrayType* DstArraySerializer = GetFastArraySerializerFromReplicationState();
202 ItemArrayType* DstWrappedArray = reinterpret_cast<ItemArrayType*>(reinterpret_cast<uint8*>(DstArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
203
204 // Check if we can early out
205 if (!bForceFullCompare && SrcArraySerializer->ArrayReplicationKey == DstArraySerializer->ArrayReplicationKey)
206 {
207 return IsDirty();
208 }
209
210 // First we must resize target to match size of source data
211 bool bMarkArrayDirty = false;
212 const uint32 ElementCount = SrcWrappedArray->Num();
214 if (DstWrappedArray->Num() != ElementCount)
215 {
216 DstWrappedArray->SetNum(ElementCount);
217 }
218
219 const FReplicationStateDescriptor* ArrayElementDescriptor = GetArrayElementDescriptor();
220 const FReplicationStateMemberDescriptor* MemberDescriptors = ArrayElementDescriptor->MemberDescriptors;
221
222 // We currently use a simple modulo scheme for bits in the changemask
223 // A single bit might represent several entries in the array which all will be considered dirty, it is up to the serializer to handle this
224 // The first bit is used by the owning property we need to offset by one and deduct one from the usable bits
225 FNetBitArrayView MemberChangeMask = UE::Net::Private::GetMemberChangeMask(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor);
226
227 const FReplicationStateMemberChangeMaskDescriptor& MemberChangeMaskDescriptor = ReplicationStateDescriptor->MemberChangeMaskDescriptors[0];
230
231 FastArrayItemType* DstItems = DstWrappedArray->GetData();
232 FastArrayItemType* SrcItems = SrcWrappedArray->GetData();
233
234 // We keep a separate count as we do not care about items that should not be replicated.
236 {
237#if WITH_PUSH_MODEL
238 // Disable push model by temporarily setting the FastArray's RepIndex to none.
239 // This prevents the array from adding itself to the global dirty list via MarkItemDirty while we are polling it.
241#endif
242
243 // Iterate over array entries and copy the statedata using internal data if it has changed
244 for (int32 ElementIt = 0, ElementEndIt = ElementCount; ElementIt < ElementEndIt; ++ElementIt)
245 {
247 FastArrayItemType& SrcItem = SrcItems[ElementIt];
248 FastArrayItemType& DstItem = DstItems[DstElementIt];
249
250 const bool bIsWritingOnClient = false;
252 {
253 if (SrcItem.ReplicationID == INDEX_NONE)
254 {
255 SrcArraySerializer->MarkItemDirty(SrcItem);
256 }
257
258 const bool bReplicationKeyChanged = SrcItem.ReplicationKey != DstItem.ReplicationKey || SrcItem.ReplicationID != DstItem.ReplicationID;
259 if (bReplicationKeyChanged || (bForceFullCompare && !InternalCompareArrayElement(ArrayElementDescriptor, &DstItem, &SrcItem)))
260 {
261 InternalCopyArrayElement(ArrayElementDescriptor, &DstItem, &SrcItem);
262 DstItem.ReplicationKey = SrcItem.ReplicationKey;
263
264 // Mark element as dirty and mark array as dirty as well.
265 if (ChangeMaskBitCount)
266 {
267 MemberChangeMask.SetBit((DstElementIt % ChangeMaskBitCount) + ChangeMaskBitOffset);
268 }
269 bMarkArrayDirty = true;
270 }
271 ++DstItemCount;
272 }
273 }
274 }
275
276 // Set actual num replicated items.
277 if (DstWrappedArray->Num() != DstItemCount)
278 {
279 // Set actual num, but keeping the allocated size of the source array
281 }
282
283 // Mark dirty if the new filtered size differs from our previous state.
285
286 // We update this after the poll since every call to MarkItem() dirty will Increase the ArrayReplicationKey
287 DstArraySerializer->ArrayReplicationKey = SrcArraySerializer->ArrayReplicationKey;
288
289 // Mark the NetObject as dirty
290 if (bMarkArrayDirty && ReplicationState->IsCustomConditionEnabled(FIrisFastArraySerializer::IrisFastArrayPropertyBitIndex))
291 {
293 MarkNetObjectStateHeaderDirty(UE::Net::Private::GetReplicationStateHeader(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor));
294 }
295
296 return IsDirty();
297}
298
299template <typename FastArrayItemType, typename FastArrayType>
301{
302 // Temporary
303 FastArrayType ReceivedState;
304
305 // Dequantize into temporary array, using partial dequantize based on changemask
306 InternalDequantizeFastArray(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
307
308 // Output state to string
309 ToString(StringBuilder, reinterpret_cast<uint8*>(&ReceivedState), GetFastArrayPropertyStructDescriptor());
310}
311
312template <typename FastArrayItemType, typename FastArrayType>
314{
315 FReplicationStateHeader& ReplicationStateHeader = Private::GetReplicationStateHeader(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor);
316 return Private::FReplicationStateHeaderAccessor::GetIsStateDirty(ReplicationStateHeader);
317}
318
319template <typename FastArrayItemType, typename FastArrayType>
321{
322 FReplicationStateHeader& ReplicationStateHeader = Private::GetReplicationStateHeader(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor);
323 bool bIsStateDirty = Private::FReplicationStateHeaderAccessor::GetIsStateDirty(ReplicationStateHeader);
324 return bIsStateDirty || Private::GetMemberPollMask(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor).IsAnyBitSet();
325}
326
327template <typename FastArrayItemType, typename FastArrayType>
329{
330 // Mark the NetObject as dirty
331 if (ReplicationState->IsCustomConditionEnabled(FIrisFastArraySerializer::IrisFastArrayPropertyBitIndex))
332 {
333 FNetBitArrayView MemberChangeMask = UE::Net::Private::GetMemberChangeMask(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor);
335 MarkNetObjectStateHeaderDirty(UE::Net::Private::GetReplicationStateHeader(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor));
336 }
337}
338
339template <typename FastArrayItemType, typename FastArrayType>
341{
342 const FReplicationStateDescriptor* Descriptor = ReplicationStateDescriptor;
343
344 // If we get here we are either the init state or dirty
345 if (const UFunction* RepNotifyFunction = Descriptor->MemberPropertyDescriptors[0].RepNotifyFunction)
346 {
347 // if this is the init state, we compare against default and early out if initial state does not differ from default (empty)
348 if (Context.bIsInit)
349 {
350 FastArrayType ReceivedState;
351 FastArrayType DefaultState;
352 InternalDequantizeFastArray(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
353 InternalDequantizeExtraProperties(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
355 {
356 return;
357 }
358 }
359
360 Owner->ProcessEvent(const_cast<UFunction*>(RepNotifyFunction), nullptr);
361 }
362}
363
364/*
365 * TNativeFastArrayReplicationFragment implementation
366 */
367template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
377
378template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
380{
381 Traits |= InTraits;
382 Context.RegisterReplicationFragment(this, ReplicationStateDescriptor.GetReference(), reinterpret_cast<uint8*>(GetFastArraySerializerFromOwner()));
383}
384
385template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
387{
388 const FReplicationStateDescriptor* Descriptor = ReplicationStateDescriptor;
389
390 // if we get here we are either the init state or dirty
391 if (const UFunction* RepNotifyFunction = Descriptor->MemberPropertyDescriptors[0].RepNotifyFunction)
392 {
393 // if this is the init state, we compare against default and early out if initial state does not differ from default (empty)
394 if (Context.bIsInit)
395 {
396 FastArrayType ReceivedState;
397 FastArrayType DefaultState;
398 InternalDequantizeFastArray(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
400 {
401 return;
402 }
403 }
404
405 Owner->ProcessEvent(const_cast<UFunction*>(RepNotifyFunction), nullptr);
406 }
407}
408
409template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
411{
412 // We ignore object references polling. Since the source state will have references cleaned up they will be valid once any affected item is dirtied.
414 {
416 {
417 return PollAllState();
418 }
419 }
420
421 return IsDirty();
422}
423
424template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
426{
427 using FPollingState = FastArrayPollingPolicies::FPollingState;
428 if (FPollingState* PollingState = PollingPolicy.GetPollingState())
429 {
430 // Get the source FastArraySerializer and array
431 FastArrayType* SrcArraySerializer = GetFastArraySerializerFromOwner();
432 ItemArrayType* SrcWrappedArray = reinterpret_cast<ItemArrayType*>(reinterpret_cast<uint8*>(SrcArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
433
434 // Check if we can early out
435 if (SrcArraySerializer->ArrayReplicationKey == PollingState->ArrayReplicationKey)
436 {
437 return IsDirty();
438 }
439
440 // First we must resize target to match size of source data
441 bool bMarkArrayDirty = false;
442 const uint32 ElementCount = SrcWrappedArray->Num();
443 if (PollingState->ItemPollData.Num() != ElementCount)
444 {
445 PollingState->ItemPollData.SetNum(ElementCount);
446 bMarkArrayDirty = true;
447 }
448
450
451 // We currently use a simple modulo scheme for bits in the changemask
452 // A single bit might represent several entries in the array which all will be considered dirty, it is up to the serializer to handle this
453 // The first bit is used by the owning property we need to offset by one and deduct one from the usable bits
454 const FReplicationStateMemberChangeMaskDescriptor& MemberChangeMaskDescriptor = ReplicationStateDescriptor->MemberChangeMaskDescriptors[0];
457
458 FPollingState::FEntry* DstItems = PollingState->ItemPollData.GetData();
459 FastArrayItemType* SrcItems = SrcWrappedArray->GetData();
460
461 // Iterate over array entries and copy the statedata using internal data if it has changed
462 for (uint32 ElementIt = 0, ElementEndIt = ElementCount; ElementIt < ElementEndIt; ++ElementIt)
463 {
464 FastArrayItemType& SrcItem = SrcItems[ElementIt];
465 FPollingState::FEntry& DstItem = DstItems[ElementIt];
466
467 const bool bIsWritingOnClient = false;
469 {
470 if (SrcItem.ReplicationID == INDEX_NONE)
471 {
472 SrcArraySerializer->MarkItemDirty(SrcItem);
473 }
474
475 if (SrcItem.ReplicationKey != DstItem.ReplicationKey || SrcItem.ReplicationID != DstItem.ReplicationID)
476 {
477 DstItem.ReplicationKey = SrcItem.ReplicationKey;
478 DstItem.ReplicationID = SrcItem.ReplicationID;
479
480 // Mark element as dirty and mark array as dirty as well.
481 if (ChangeMaskBitCount)
482 {
483 MemberChangeMask.SetBit((ElementIt % ChangeMaskBitCount) + ChangeMaskBitOffset);
484 }
485 bMarkArrayDirty = true;
486 }
487 }
488 else
489 {
490 ensureMsgf(false, TEXT("Native IrisFastArraySerializer does not support local non-replicated items, use FastArraySerializer intead if this is required."));
491
492 // Even if the native variant do not really support not replicated entries we still mark the item dirty and update the stored data to keep logic working.
493 if (SrcItem.ReplicationKey != DstItem.ReplicationKey || SrcItem.ReplicationID != DstItem.ReplicationID)
494 {
495 DstItem.ReplicationKey = SrcItem.ReplicationKey;
496 DstItem.ReplicationID = SrcItem.ReplicationID;
497
498 // Mark element as dirty and mark array as dirty as well.
499 if (ChangeMaskBitCount)
500 {
501 MemberChangeMask.SetBit((ElementIt % ChangeMaskBitCount) + ChangeMaskBitOffset);
502 }
503 bMarkArrayDirty = true;
504 }
505 }
506 }
507
508 // We update this after the poll since every call to MarkItem() dirty will Increase the ArrayReplicationKey
509 PollingState->ArrayReplicationKey = SrcArraySerializer->ArrayReplicationKey;
510
511 if (bMarkArrayDirty)
512 {
513 const bool bHasCustomConditionals = EnumHasAnyFlags(ReplicationStateDescriptor->Traits, EReplicationStateTraits::HasLifetimeConditionals);
515 {
517 }
518 }
519 }
520
521 return IsDirty();
522}
523
524template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
526{
527 FastArrayType* SrcArraySerializer = GetFastArraySerializerFromOwner();
529 return Private::FReplicationStateHeaderAccessor::GetIsStateDirty(ReplicationStateHeader);
530}
531
532template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
534{
535 // As we must preserve local data and generate proper callbacks we must dequantize into a temporary state
536 // We could do a selective operation and keep an targetstate around and only do incremental updates of this state
537 FastArrayType ReceivedState;
538
539 // Dequantize into temporary array
540 InternalDequantizeFastArray(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
541
542 // Get the wrapped FastArraySerializer and array
543 FastArrayType* DstArraySerializer = reinterpret_cast<FastArrayType*>(reinterpret_cast<uint8*>(Owner) + ReplicationStateDescriptor->MemberProperties[0]->GetOffset_ForGC());
544 ItemArrayType* DstWrappedArray = reinterpret_cast<ItemArrayType*>((uint8*)(DstArraySerializer) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
545
546 // Intentionally not const as we allow the src state to be modified
547 FastArrayType* SrcArraySerializer = &ReceivedState;
548 const ItemArrayType* SrcWrappedArray = reinterpret_cast<const ItemArrayType*>(reinterpret_cast<uint8*>(&ReceivedState) + WrappedArrayOffsetRelativeFastArraySerializerProperty);
549
550 // Apply state and issue callbacks etc
552}
553
554template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
556{
557 // Create temporary
558 FastArrayType ReceivedState;
559
560 // Dequantize into temporary array
561 InternalDequantizeFastArray(*Context.NetSerializationContext, reinterpret_cast<uint8*>(&ReceivedState), Context.StateBufferData.RawStateBuffer, GetFastArrayPropertyStructDescriptor());
562
563 // Output state to string
564 ToString(StringBuilder, reinterpret_cast<uint8*>(&ReceivedState), GetFastArrayPropertyStructDescriptor());
565}
566
567template <typename FastArrayItemType, typename FastArrayType, typename PollingPolicyType>
569{
570 return reinterpret_cast<FastArrayType*>(reinterpret_cast<uint8*>(Owner) + ReplicationStateDescriptor->MemberProperties[0]->GetOffset_ForGC());
571}
572
573namespace Private {
574
575template <typename FastArrayType>
577{
578 using namespace UE::Net;
579 static_assert(TFastArrayTypeHelper<FastArrayType>::HasValidFastArrayItemType(), "Invalid FastArrayItemType detected. Make sure that FastArraySerializer has a single replicated property that is a dynamic array of the expected type");
580
582 {
584 {
586 if (FFragmentType* Fragment = new FFragmentType(Context.GetFragmentTraits(), Owner, Descriptor))
587 {
589 return Fragment;
590 }
591 return nullptr;
592 }
593 }
594
596 if (FFragmentType* Fragment = new FFragmentType(Context.GetFragmentTraits(), Owner, Descriptor))
597 {
599 return Fragment;
600 }
601 return nullptr;
602}
603
604}} // End of namespaces
605
606
#define checkSlow(expr)
Definition AssertionMacros.h:332
#define ensureMsgf( InExpression, InFormat,...)
Definition AssertionMacros.h:465
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
constexpr bool EnumHasAnyFlags(Enum Flags, Enum Contains)
Definition EnumClassFlags.h:35
#define IRIS_PROFILER_PROTOCOL_NAME(X)
Definition IrisProfiler.h:58
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
virtual bool Identical(const void *A, const void *B, uint32 PortFlags=0) const PURE_VIRTUAL(FProperty
Definition UnrealType.h:515
Definition Array.h:670
static constexpr bool HasValidFastArrayItemType()
Definition FastArraySerializer.h:259
Definition UniquePtr.h:107
Definition ReplicationFragment.h:244
Definition NetBitArray.h:337
bool IsAnyBitSet() const
Definition NetBitArray.h:1460
bool GetBit(uint32 Index) const
Definition NetBitArray.h:1537
Definition ReplicationFragment.h:176
EReplicationFragmentTraits Traits
Definition ReplicationFragment.h:216
Definition FastArrayReplicationFragmentInternal.h:38
Definition FastArrayReplicationFragmentInternal.h:101
IRISCORE_API void Register(FFragmentRegistrationContext &Context, EReplicationFragmentTraits InTraits)
Definition FastArrayReplicationFragment.cpp:126
Definition FastArrayReplicationFragmentInternal.h:153
Definition FastArrayReplicationFragment.h:28
TUniquePtr< FastArrayType > AccumulatedReceivedState
Definition FastArrayReplicationFragment.h:69
void ApplyReplicatedStateForExtraProperties(FReplicationStateApplyContext &Context) const
Definition FastArrayReplicationFragment.h:141
void MarkDirty()
Definition FastArrayReplicationFragment.h:328
bool IsDirty() const
Definition FastArrayReplicationFragment.h:313
TFastArrayReplicationFragment(EReplicationFragmentTraits InTraits, UObject *InOwner, const FReplicationStateDescriptor *InDescriptor, const EAllowAdditionalPropertiesType)
Definition FastArrayReplicationFragment.h:35
virtual void ReplicatedStateToString(FStringBuilderBase &StringBuilder, FReplicationStateApplyContext &Context, EReplicationStateToStringFlags Flags) const override
Definition FastArrayReplicationFragment.h:300
bool PollAllState(bool bForceFullCompare=false)
Definition FastArrayReplicationFragment.h:192
virtual void ApplyReplicatedState(FReplicationStateApplyContext &Context) const override
Definition FastArrayReplicationFragment.h:122
TArray< FastArrayItemType > ItemArrayType
Definition FastArrayReplicationFragment.h:30
EAllowAdditionalPropertiesType
Definition FastArrayReplicationFragment.h:34
@ AllowAdditionalProperties
Definition FastArrayReplicationFragment.h:34
bool IsDirtyForPolling() const
Definition FastArrayReplicationFragment.h:320
FastArrayType * GetFastArraySerializerFromReplicationState() const
Definition FastArrayReplicationFragment.h:160
FastArrayType * GetFastArraySerializerFromApplyContext(FReplicationStateApplyContext &Context) const
Definition FastArrayReplicationFragment.h:154
TFastArrayReplicationFragment(EReplicationFragmentTraits InTraits, UObject *InOwner, const FReplicationStateDescriptor *InDescriptor, bool bValidateDescriptor=true)
Definition FastArrayReplicationFragment.h:113
virtual void CallRepNotifies(FReplicationStateApplyContext &Context) override
Definition FastArrayReplicationFragment.h:340
FastArrayType * GetFastArraySerializerFromOwner() const
Definition FastArrayReplicationFragment.h:148
virtual bool PollReplicatedState(EReplicationFragmentPollFlags PollOption) override
Definition FastArrayReplicationFragment.h:167
Definition FastArrayReplicationFragment.h:82
virtual void ReplicatedStateToString(FStringBuilderBase &StringBuilder, FReplicationStateApplyContext &Context, EReplicationStateToStringFlags Flags) const override
Definition FastArrayReplicationFragment.h:555
virtual bool PollReplicatedState(EReplicationFragmentPollFlags PollOption) override
Definition FastArrayReplicationFragment.h:410
bool IsDirty() const
Definition FastArrayReplicationFragment.h:525
FastArrayType * GetFastArraySerializerFromOwner() const
Definition FastArrayReplicationFragment.h:568
TNativeFastArrayReplicationFragment(EReplicationFragmentTraits InTraits, UObject *InOwner, const FReplicationStateDescriptor *InDescriptor)
Definition FastArrayReplicationFragment.h:368
TArray< FastArrayItemType > ItemArrayType
Definition FastArrayReplicationFragment.h:84
void Register(FFragmentRegistrationContext &Fragments, EReplicationFragmentTraits Traits=EReplicationFragmentTraits::None)
Definition FastArrayReplicationFragment.h:379
bool PollAllState()
Definition FastArrayReplicationFragment.h:425
virtual void ApplyReplicatedState(FReplicationStateApplyContext &Context) const override
Definition FastArrayReplicationFragment.h:533
virtual void CallRepNotifies(FReplicationStateApplyContext &Context) override
Definition FastArrayReplicationFragment.h:386
Definition Class.h:2476
Definition Object.h:95
Definition OverriddenPropertySet.cpp:45
UE::Net::FReplicationStateHeader & GetReplicationStateHeader(void *StateBuffer, const FReplicationStateDescriptor *Descriptor)
Definition ReplicationStateUtil.h:28
FNetBitArrayView GetMemberPollMask(uint8 *StateBuffer, const FReplicationStateDescriptor *Descriptor)
Definition ReplicationStateUtil.h:59
FNetBitArrayView GetMemberChangeMask(uint8 *StateBuffer, const FReplicationStateDescriptor *Descriptor)
Definition ReplicationStateUtil.h:43
Definition NetworkVersion.cpp:28
EReplicationStateToStringFlags
Definition ReplicationFragment.h:94
EReplicationFragmentPollFlags
Definition ReplicationFragment.h:153
EReplicationFragmentTraits
Definition ReplicationFragment.h:102
void MarkNetObjectStateHeaderDirty(FReplicationStateHeader &Header)
Definition ReplicationStateUtil.h:15
@ false
Definition radaudio_common.h:23
@ IrisFastArrayChangeMaskBitOffset
Definition IrisFastArraySerializer.h:30
@ IrisFastArrayPropertyBitIndex
Definition IrisFastArraySerializer.h:31
Definition UnrealTemplate.h:341
Definition UnrealTypeTraits.h:40
Definition ReplicationFragment.h:66
Definition ReplicationStateDescriptor.h:199
const FReplicationStateMemberPropertyDescriptor * MemberPropertyDescriptors
Definition ReplicationStateDescriptor.h:226
const FProperty ** MemberProperties
Definition ReplicationStateDescriptor.h:222
EReplicationStateTraits Traits
Definition ReplicationStateDescriptor.h:274
Definition ReplicationStateFwd.h:20
Definition ReplicationStateDescriptor.h:77
uint16 BitOffset
Definition ReplicationStateDescriptor.h:78
Definition ReplicationStateDescriptor.h:30
const UFunction * RepNotifyFunction
Definition ReplicationStateDescriptor.h:155
Definition FastArrayReplicationFragmentInternal.h:24
static void ApplyReplicatedState(FastArrayType *DstFastArray, ItemArrayType *DstWrappedArray, FastArrayType *SrcFastArray, const ItemArrayType *SrcWrappedArray, const FReplicationStateDescriptor *ArrayElementDescriptor, FReplicationStateApplyContext &Context)
Definition FastArrayReplicationFragmentInternal.h:202
static IRISCORE_API FNetBitArrayView GetChangeMask(FIrisFastArraySerializer &Array)
Definition IrisFastArraySerializer.cpp:95
static IRISCORE_API void MarkArrayDirty(FIrisFastArraySerializer &Array)
Definition IrisFastArraySerializer.cpp:125
static FReplicationStateHeader & GetReplicationStateHeader(FIrisFastArraySerializer &Array)
Definition IrisFastArraySerializerInternal.h:25
static IRISCORE_API FNetBitArrayView GetConditionalChangeMask(FIrisFastArraySerializer &Array)
Definition IrisFastArraySerializer.cpp:100