gpt4 book ai didi

javascript - 客户端预测与服务器保持同步?

转载 作者:行者123 更新时间:2023-11-30 00:15:55 24 4
gpt4 key购买 nike

我目前正在开发一款多人游戏。我的客户端预测出现问题。左右移动一段时间后,服务器位置和客户端位置发生偏移。 Here是目前的游戏。服务器位置以橙色显示。您的本地位置显示为白色。我所做的只是在本地和服务器上模拟玩家的移动。这是移动代码:

var xMov = 0;
var yMov = 0;
if (player.keys.up) {
yMov -= 1;
}
if (player.keys.down) {
yMov += 1;
}
if (player.keys.right) {
xMov += 1;
}
if (player.keys.left) {
xMov -= 1;
}
xMov /= REFRESH_INTERVAL;
yMov /= REFRESH_INTERVAL;
var length = Math.sqrt(xMov * xMov + yMov * yMov);
if (length != 0) {
playerMoved = true;
xMov /= length;
yMov /= length;
xMov *= player.speed;
yMov *= player.speed;
player.deltaX += xMov;
player.deltaY += yMov;
} else {
playerMoved = false;
}
var oldX = player.x;
var oldY = player.y;
player.deltaX *= c.speedDecel * delta;
if (player.deltaX <= 0.1 && player.deltaX >= -0.1)
player.deltaX = 0;
player.deltaY *= c.speedDecel * delta;
if (player.deltaY <= 0.1 && player.deltaY >= -0.1)
player.deltaY = 0;
player.x += player.deltaX * delta;
player.y += player.deltaY * delta;
player.x = Math.round(player.x);
player.y = Math.round(player.y);

客户端和服务器端的代码是相同的。当用户按下某个键时,将键信息发送到服务器:

sendDataArray[0] = key;
sendDataArray[1] = val;
socket.emit('3', sendDataArray);

然后在服务器上,设置键值。我认为我遇到的问题是客户端和服务器端的时间问题。上面显示的移动方法是从客户端和服务器端的 setInterval 调用的:

setInterval(move, 31);

因此,当我按下该键时,在客户端,调用下一个 move() 可能需要 5 毫秒。而在服务器上,当他收到关键信息时,可能又是30ms。这可能会导致不一致。

如何解决?

最佳答案

使用纠错信息

从客户端您还应该在每次调用时发送位置和时间。这样服务器可以确定自上次消息以来是否已经过去 X 时间并且该时间看起来正确,然后查看位置,如果相对于最后已知位置和已知时间的位置似乎可以接受,则调整服务器位置以匹配。

关于javascript - 客户端预测与服务器保持同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34734382/

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