Node.js 玩家定位服务器端还是客户端?

Node.js 玩家定位服务器端还是客户端?,node.js,socket.io,pong,Node.js,Socket.io,Pong,我刚刚用socket.io制作了一个游戏Pong的多人浏览器实现,我有一个关于实时物流的问题。基本上,玩家的球拍只是一个彩色的div,根据他们按下的按钮向上或向下移动。我注意到在使用AWS的两台不同的计算机上测试我的程序时,运动几乎完全同步,但有时并不精确。对于控制球拍的玩家来说,球拍的移动是在本地完成的,但是对于他们与服务器对抗的玩家来说,服务器会不断向他们发送对手是上移还是下移的数据 我的问题是我应该在服务器端做所有的移动吗?就像一个用户按下按钮向上移动一样,它向服务器发送一个请求,向两个玩

我刚刚用socket.io制作了一个游戏Pong的多人浏览器实现,我有一个关于实时物流的问题。基本上,玩家的球拍只是一个彩色的div,根据他们按下的按钮向上或向下移动。我注意到在使用AWS的两台不同的计算机上测试我的程序时,运动几乎完全同步,但有时并不精确。对于控制球拍的玩家来说,球拍的移动是在本地完成的,但是对于他们与服务器对抗的玩家来说,服务器会不断向他们发送对手是上移还是下移的数据

我的问题是我应该在服务器端做所有的移动吗?就像一个用户按下按钮向上移动一样,它向服务器发送一个请求,向两个玩家发出该划桨移动的请求,或者我的方式是在本地移动你的划桨吗

我现在的代码如下所示:

socket.on('moveReq', function(data){   // Send to opponent that other paddle moved
    socket.broadcast.emit("movePaddle", data);
});
客户端检查是否按下了向上或向下按钮并发出移动请求:

paddleMove = 0; // Keep track of which direction to move
speed = 5; 
    if (paddleL.position().top > arena.position().top){ // If left paddle not at top
        if (keysPressed.up) paddleMove -= speed;
    }
    if (paddleL.position().top+paddleL.height() < arena.position().top + arena.height() - 15){ // If left paddle not at bottom
        if (keysPressed.down) paddleMove += speed;
    }
    paddleL.css({  // Move paddle locally
        top: paddleL.cssNumber('top') + paddleMove + 'px'
    });
    socket.emit("moveReq", paddleMove); // Send to server 
这反过来会提醒用户端代码的另一部分移动另一个拨杆:

socket.on("movePaddle", function(data){

        var paddleMove = 0;
        paddleMove += data; // Data is speed (direction) of movement
        paddleR.css({ // Move right paddle
            top: paddleR.cssNumber('top') + paddleMove + 'px'
        });

正如我所说,现在的运动很好,但并不完美。我是否应该不将任何移动设置为本地,并将其全部设置为在服务器上

立即在客户端更新位置。然后将移动消息发送到服务器。 当您收到服务器返回的消息时,将位置同步到服务器的值


这样,在脆弱或高延迟的连接上,客户端的移动应该仍然是平滑的。然而,在某些极端情况下,客户端可能太不同步了,以至于球拍似乎处于不同步的位置(球可能会穿过球拍)-尽管无论哪种方式,高ping都会解决问题

目前我甚至正在使用web套接字开发多人游戏。 如果你想要实时的球员位置,那么它将需要大量的带宽

到目前为止,我所做的是预测和学习。 假设有两个名为A&B的玩家相连

假设玩家A默认在x=0(t=0)上,那么在B上它也将在x=0上。 现在我们要做的是开始每1秒发射一次A的x位置(取决于你的游戏,如果fps,则降低值)

1秒后(t=1),A的位置为x=2(根据您的说法为2px)。 B在1.2秒后收到A的位置(考虑到由于网络问题而延迟)。现在我们必须将位置从x=0调整到x=1,以预测时间。(这一切都可以通过脚本实现)

基本公式(这将在更新函数中完成)

CurrentXposition = (NewXPosition - CurrentXPosition) * deltatime ;
你一定要用上面的公式。每次我们收到新职位时,都会计算deltatime。因此,我们在这里使用deltatime进行lerp和预测

勒平将平滑玩家的移动,而作为预测的deltatime将根据接收到的位置设置正确的勒平时间和平滑度


Imo您应该在客户端进行移动,并在特定时间与服务器端同步,在这种情况下,当您使用触球式拨片时,这样可以防止服务器过载和黑客攻击。谢谢。不过我有点麻烦。我每隔250ms左右发送一次
NewXPosition
,但是在插值时,只要
NewXPosition
得到更新,字符就会“跳跃”。我是否应该以与游戏fps相同的速率发送新的lerping值?您可以通过两种方式处理位置同步。一种是通过每秒发送10帧的位置或按键。当您使用时间戳接收到每个帧时,您必须计算延迟时间。i、 从上一帧开始经过的时间,游戏更新率之间的差异,以及你必须使用一些逻辑来模拟物理。