【问题标题】:Client-server communication, websockets latency客户端-服务器通信,websockets 延迟
【发布时间】:2016-11-12 15:51:03
【问题描述】:

小问题:

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

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

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

【问题讨论】:

    标签: javascript node.js websocket latency


    【解决方案1】:

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

    是的,当然。连接变化一直在发生。尤其是移动设备的天线移动幅度很大,会导致连接暂时中断。

    我正在使用 websockets 制作一个 html 游戏,目前正在处理客户端输入预测,我正在为客户端和服务器使用相同的代码来检查冲突,以 30 次/秒计算新玩家位置。

    ...

    当用户按住“D”键盘按钮时,conrols.pressingRight 值变为true,直到玩家释放“D”按钮才为true。

    这绝对是一种方式,但如果你走这条路,服务器应该是你了解事物状态的真实来源。客户端可以移动到它认为移动的位置,然后服务器可以更新位置,将客户端弹回标准的服务器已知版本的事件。在最佳情况下,客户不会移动太多。但是,会发生延迟,有时该客户端会快速返回到更远的位置。

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

    【讨论】:

    • 但是如果服务器端和客户端共享相同的代码,那么客户端不应该在大约 99% 的时间里正确吗?至少这是我读过的。因为我的实现只有大约 50% 的时间是正确的。
    • 不,会有很多偏差,随着延迟的增加而增加。尝试使用服务器(例如 Halo)玩任何第一人称射击视频游戏,发现同样的问题。
    猜你喜欢
    • 2018-03-17
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    相关资源
    最近更新 更多