为保证玩家的运行流畅性,无论玩家是作为客户端还是服务端,都先运行出本地结果,然后再与服务端和其他玩家同步。某个行为在执行后,客户端保存执行次数,然后使用服务端也执行同样次数之后的结果覆盖客户端的本地结果。
UE模拟客户端的网络延时,例如300毫秒延时,编辑文件DefaultEngine.ini,增加以下字段:
[PacketSimulationSettings]
Pktlag = 300
例如在射击游戏中,子弹的剩余数量应当由服务端决定,但如果客户端在射击7发子弹后,等待600毫秒才能看到剩余子弹的数量减少,那么体验会很差。因此,在客户端射击后,本地立即刷新剩余子弹数量(_ammo
),同时使用一个变量(_ammoUpdateSequence
)保存射击次数(7次)。
// 每射击一次增加一次计数
++_ammoUpdateSequence;
// 减少本地子弹数量
--_ammo;
服务端在每次射击后,通过RPC通知客户端当前实际剩余子弹数量。因此客户端会在600毫秒后接连7次收到服务端的子弹剩余量,每次将_ammoUpdateSequence
减少,并在_ammoUpdateSequence
等于0时将本地的子弹数量与服务器的子弹数量同步。
void Multicast_FireUpdate_Implementation(int32 ammo)
{
if (_ammoUpdateSequence != 0)
{
_ammoUpdateSequence--;
}
if (0 == _ammoUpdateSequence)
{
_ammo = ammo;
}
}