(UE)客户端网络同步的行为预测

为保证玩家的运行流畅性,无论玩家是作为客户端还是服务端,都先运行出本地结果,然后再与服务端和其他玩家同步。某个行为在执行后,客户端保存执行次数,然后使用服务端也执行同样次数之后的结果覆盖客户端的本地结果。

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;
    }
}

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注