客户端与服务器通信,WebSockets的延迟问题

3

简短问题:

当客户端向服务器发送数据包时,延迟是否会突然大幅变化?

长问题(我的问题):

我正在使用 WebSockets 制作一个 HTML 游戏,并且目前正在处理客户端输入预测。我使用相同的代码用于客户端和服务器端来检查碰撞、计算新的玩家位置,每秒30次更新玩家移动。以下是我如何在服务器端和客户端更新玩家移动的方法:

if(controls.pressingRight === true)
{
    if(controls.dx < settings.MAX_X_SPEED)
    {
        controls.dx += settings.DELTA_X_SPEED;
    }
    else
    {
        controls.dx = settings.MAX_X_SPEED;
    }
}
if(*noCollisions*)
{
    game.me.x += controls.dx;
}

这样一来,玩家的移动就比较流畅了。当用户按住“D”键时,控制.pressingRight值会被改为true,直到玩家松开“D”键。我编写代码的原因是不确定问题是否出在我的代码上或者是否与延迟变化有关。例如,我点击“D”键并快速释放它,在客户端画布上我的玩家移动了约7个像素,但在服务器端,玩家向侧面移动了20个像素或更多(尽管有时客户端和服务器端都移动相同数量的像素)。我猜测问题可能是因为当我按下按钮移动玩家时,延迟可能很低,比如说20,但当我释放时,ping可能达到200,这意味着数据包被传递的时间比应该早,因此服务器仍将我的“pressingRight”值保持为true。我有遗漏吗?
1个回答

0
客户端向服务器发送数据包时,延迟是否会突然大幅变化?
是的,绝对会。连接性变化经常发生。这在移动设备中尤其如此,天线不断移动,导致短暂失去连接。
我正在使用WebSockets制作HTML游戏,并且目前正在处理客户端输入预测。我正在使用相同的代码来检查碰撞、计算新玩家位置,每秒30次。
这绝对是一种方法,但如果您选择这条路线,则服务器应该是您了解事物状态的真实来源。客户端可以移动到它认为自己移动的位置,然后服务器可以更新位置,将客户端弹回标准的服务器已知事件版本。在最理想的情况下,客户端不会移动太多。然而,延迟会发生,有时客户端会突然跳回到一个更远的位置。

当游戏需要这样的交互性时,这个问题没有完美的解决方案。然而,有很多方法来处理它。参见:http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/


但是如果服务器端和客户端共享相同的代码,客户端不应该在99%的情况下是正确的吗?至少这是我读到的。因为我的实现只有大约50%的时间是正确的。 - Donatas
不,会有很多偏差,随着延迟的增加而增加。尝试玩任何带服务器(如《光环》)的第一人称射击游戏,您会看到同样的问题。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接