We are occasionally encountering a critical networking issue during client travel.
The client can eventually become stuck on an infinite loading screen because the server fails to send essential packets.
PacketHandlerLog: Error: Packet exceeded HandlerComponents 'MaxOutgoingBits' value: 8182 vs 8176
Upon character possession, our server implementation iterates through a configuration list to grant approximately 120 GameplayAbilities via GiveAbility().
We believe this results in a massive burst of internal RPCs and replication data being queued in a single frame.
for (const TSubclassOf<UGameplayAbility>& abilityClass : abilities)
{
if (UClass* pAbilityClass = abilityClass.Get())
{
FGameplayAbilitySpec abilitySpec(pAbilityClass);
if (abilitySpec.Ability != nullptr)
{
AbilitySystemComponent->GiveAbility(abilitySpec);
}
}
}
Assuming our hypothesis regarding packet saturation is valid, we are hesitant to increase MaxOutgoingBits in our configuration. Based on standard networking best practices, exceeding the default limits risks MTU-related issues and IP fragmentation, which can lead to packet loss on unstable consumer connections.
Our current plan is to implement a batching mechanism to grant these 120 abilities in smaller “chunks” across several frames.
Why does the engine not automatically chunk or “throttle” these updates when the delta exceeds the maximum packet size?
Beyond manual batching/staggering of GiveAbility calls, does Epic recommend a specific pattern for high-density ability sets?
[Attachment Removed]