Hi,
I don’t believe this data is required to be sent, as this seems to be a side effect of how the change mask for fast array properties is handled. From the PollAllState function for TFastArrayReplicationFragment:
// We currently use a simple modulo scheme for bits in the changemask // 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 // The first bit is used by the owning property we need to offset by one and deduct one from the usable bits FNetBitArrayView MemberChangeMask = UE::Net::Private::GetMemberChangeMask(ReplicationState->GetStateBuffer(), ReplicationStateDescriptor);
The number of bits used is defined by IrisFastArrayChangeMaskBits in FIrisFastArraySerializer, which by default is set to 63. This means that for a very large array with around 650 elements, marking one item as dirty can result in around 10 elements being considered dirty by the change mask. Depending on the properties in the fast array item struct, it looks as though you can end up with a handful of bits being written for these when FStructNetSerializer::Serialize serializes the struct’s members for these elements that haven’t changed. In my own testing, increasing the number of change mask bits seemed to reduce the number of extra elements that got serialized.
I’ve opened a new issue for this, UE-268558, which should be visible in the public tracker in a day or so.
Thanks,
Alex