客户端 - 服务器通信,websockets延迟

时间:2016-07-10 17:05:58

标签: javascript node.js websocket latency

简短的问题:

当客户端向服务器发送数据包突然改变很多时,延迟是否可以?

长问题(我遇到的问题):

我正在使用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”键盘按钮conrols.pressingRight值变为true时,直到玩家释放“D”按钮为止。我编写代码的原因是因为我不确定问题是在我的代码中还是与延迟的变化有关。例如,我单击D按钮并快速释放它,我的客户端画布上的播放器移动像~7像素但是在我的服务器端播放器移动到20像素或更多到一侧(尽管有时客户端和服务器端移动相同数量的像素) 。我猜这个问题是因为当我按下按钮移动播放器时,延迟可能会很低,让我们说20,但是当我发布时,ping可能就像是200,这意味着数据包的发送时间晚于应该的并且因为该服务器仍然将我的“pressRight”值视为真。我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

  

当客户端向服务器发送数据包时,延迟会突然改变很多吗?

是的,绝对的。连接性变化始终发生。在天线移动很多的移动设备中尤其如此,导致连接瞬间丢失。

  

我正在使用websockets进行html游戏,目前正致力于客户端输入预测,我使用相同的代码进行客户端和服务器检查冲突,计算新的玩家位置,30次/秒

     

...

     

当用户按下并按住&#34; D&#34;键盘按钮conrols.pressingRight值更改为true,直到玩家释放&#34; D&#34;按钮。

这绝对是一种方式,但如果你走这条路,服务器应该是你的事情的真相来源。客户端可以移动到它认为移动的位置,然后服务器可以更新位置,将客户端反弹回标准服务器已知的事件版本。在最佳情况下,客户不会受到太大影响。但是,滞后发生,有时客户端会重新回到更远的位置。

当游戏需要这种交互性时,没有完美的解决方案。但是,有很多方法可以解决它。另见:http://gafferongames.com/networking-for-game-programmers/what-every-programmer-needs-to-know-about-game-networking/