Quick answer: Call MarkItemDirty(Item) after mutating an entry, MarkArrayDirty() after add/remove. Without these, the delta serializer sees no change.
A FastArraySerializer inventory replicates from server. Adding items works; modifying an existing item’s count doesn’t propagate. The change marker wasn’t set.
Item Mutation Pattern
void AInventory::AddCount(int32 Index, int32 Delta)
{
if (!Items.IsValidIndex(Index)) return;
Items.Items[Index].Count += Delta;
Items.MarkItemDirty(Items.Items[Index]);
}
MarkItemDirty notifies the serializer that this item changed; the delta packet carries just this item.
Add/Remove
Items.Items.Add(NewItem);
Items.MarkArrayDirty();
For collection changes, MarkArrayDirty rebuilds the structure delta. Without this, the new item is invisible to clients.
FFastArraySerializerItem Override
Each item type extends FFastArraySerializerItem and may override:
void PreReplicatedRemove(const FFastArraySerializer&);
void PostReplicatedAdd(const FFastArraySerializer&);
void PostReplicatedChange(const FFastArraySerializer&);
Use PostReplicatedChange for client-side update (refresh UI). PostReplicatedAdd for new items.
Network Profiler
Window → Developer Tools → Network Profiler. Capture a session. See per-frame bytes for your array; jumps indicate full re-replication (you forgot dirty), small bytes indicate delta is working.
Verifying
Server mutates inventory. Client UI updates. Network bytes per change are small (one item, not whole array). Add/remove also delta.
“FastArray reps deltas, but only if you mark. Mutate + MarkItemDirty is the contract.”
For large inventories (1000+ items), profile carefully. FastArray scales well only if each mutation is correctly marked; otherwise you blow your bandwidth.