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

Client Side Prediction Keeping Movement in Sync with Server?

我目前正在开发一款多人游戏。我的客户端预测出现问题。左右移动一段时间后,服务器位置和客户端位置发生偏移。 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 时间并且该时间看起来正确,然后查看位置,如果相对于最后已知位置和已知时间的位置似乎可以接受,则调整服务器位置以匹配。