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

时间:2016-01-12 01:58:05

标签: javascript socket.io

我目前正在开展多人游戏。我遇到了客户端预测的问题。移动一段时间后,服务器位置和客户端位置将被抵消。 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);

因此,当我按下键时,在客户端,它可能是5ms,直到调用下一个move()。而在服务器上,当他收到密钥信息时,可能是另一个30ms。这可能会导致不一致。

如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

使用纠错信息

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