7. 优化(Optimizations)
7.1 Ability 批处理(Ability Batching)
在一个帧内激活、可选地发送TargetData
到服务器并结束的GameplayAbilities
可以通过批处理将两到三个RPC合并为一个RPC。这些类型的能力通常用于命中扫描枪。
7.2 Gameplay Cue 批处理(Gameplay Cue Batching)
如果您同时发送许多GameplayCues
,请考虑将它们批处理为一个RPC。目标是减少RPC的数量(GameplayCues
是不可靠的NetMulticasts)并尽可能少地发送数据。
7.3 AbilitySystemComponent 同步模式(AbilitySystemComponent Replication Mode)
默认情况下,ASC
处于Full Replication Mode
。这将所有GameplayEffects
同步到每个客户端(这对于单人游戏是可以的)。在多人游戏中,将玩家拥有的ASCs
设置为Mixed Replication Mode
,将AI控制的角色设置为Minimal Replication Mode
。这将使应用于玩家角色的GEs
仅同步到该角色的所有者,而应用于AI控制角色的GEs
将永远不会同步到客户端。GameplayTags
仍将同步,GameplayCues
仍将是不可靠的NetMulticast到所有客户端,无论Replication Mode
如何。这将减少不需要所有客户端看到的GEs
的网络数据。
7.4 Attribute 代理同步(Attribute Proxy Replication)
在像《堡垒之夜》(Fortnite)这样的大型多人游戏中,会有许多ASCs
存在于始终相关的PlayerStates
上同步大量的Attributes
。为了优化这个瓶颈,堡垒之夜禁用了ASC
及其AttributeSets
在模拟玩家控制代理上的同步,位于PlayerState::ReplicateSubobjects()
中。自主代理和AI控制的Pawns
仍然根据其Replication Mode
完全同步。相反,堡垒之夜在玩家的Pawn
上使用一个同步的代理结构。当服务器的ASC
上的Attributes
发生变化时,它们也会在代理结构上发生变化。客户端从代理结构接收同步的Attributes
并将更改推送回其本地ASC
。这允许Attribute
同步使用Pawn
的相关性和NetUpdateFrequency
。这个代理结构还同步一个小的白名单GameplayTags
集作为位掩码。这种优化减少了网络上的数据量,并允许我们利用pawn的相关性。AI控制的Pawns
将其ASC
放在Pawn
上,已经使用其相关性,因此不需要这种优化。
我不确定在其他服务器端优化(如同步图等)之后是否仍然有必要,并且这不是最可维护的模式。
Epic的Dave Ratti对社区问题#3的回答
7.5 ASC 延迟加载(ASC Lazy Loading)
《堡垒之夜》(Fortnite)世界中有许多可损坏的AActors
(树木、建筑物等),每个都有一个ASC
。这可能会增加内存成本。堡垒之夜通过仅在需要时(当它们首次受到玩家伤害时)延迟加载ASCs
来优化这一点。这减少了整体内存使用,因为在一场比赛中某些AActors
可能永远不会受到伤害。