gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 00:06:12 26 4
gpt4 key购买 nike

小问题:

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

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

我正在使用 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 按钮并快速释放它,我的客户端 Canvas 上的播放器移动了大约 7 像素,但在我的服务器端播放器移动了 20 像素或更多(尽管有时客户端和服务器端移动了相同数量的像素) .我猜问题是因为当我按下按钮移动播放器时,延迟可能很低,比方说 20,但是当我释放 ping 时可能像 200,这意味着数据包的交付时间晚于它应该已经并且由于该服务器仍然将我的“pressingRight”值为真。我错过了什么吗?

最佳答案

Can latency, when a client is sending packets to the server suddenly change a lot?

是的,绝对是。连接变化一直在发生。在天线移动很多的移动设备中尤其如此,这会导致连接暂时中断。

I'm making a html game using websockets and currently working on client side input prediction, I'm using the same code for client and for server to check for collisions, calculate new player positions, 30times/second.

...

When a user press and holds down "D" keyboard button conrols.pressingRight value is changed to true, and it is true until player releases the "D" button.

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

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

关于javascript - 客户端-服务器通信、websockets 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38294403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com