Node.js 使实时socket.io Pong游戏更快

Node.js 使实时socket.io Pong游戏更快,node.js,socket.io,real-time,pong,Node.js,Socket.io,Real Time,Pong,我刚刚使用node.js和socket.io实现了游戏Pong,客户端使用jQuery。我将游戏放在我的免费层AWS实例上,机制工作正常,但延迟是不可编程的。在游戏中,控制它的玩家的桨在本地移动。客户端还发送服务器请求,每requestFrameAnimation一次向对手广播桨叶移动。发球的球员按下空格键,空格键发送发球请求,然后向两名球员发出发球请求,开始球的移动 桨叶运动和球的发射都受到延迟的影响。对于拨片,我认为问题在于,我每requestFrameAnimation发送一个服务器请求,

我刚刚使用node.js和socket.io实现了游戏Pong,客户端使用jQuery。我将游戏放在我的免费层AWS实例上,机制工作正常,但延迟是不可编程的。在游戏中,控制它的玩家的桨在本地移动。客户端还发送服务器请求,每
requestFrameAnimation
一次向对手广播桨叶移动。发球的球员按下空格键,空格键发送发球请求,然后向两名球员发出发球请求,开始球的移动

桨叶运动和球的发射都受到延迟的影响。对于拨片,我认为问题在于,我每
requestFrameAnimation
发送一个服务器请求,这可能是速度太快了。也许我应该做一个设定间隔,每隔几秒钟就把球员的划桨位置发送给他的对手。至于球,因为它开始移动的信号是由服务器发送的,我想我需要在按下空格键之前发送一个球发射的实际时间,这样每个本地机器都可以倒计时到那个时间

以下是我的客户端代码片段,用于某些上下文:

function updateFrame(){
    paddleSpeed = 0;
    if (keysPressed.up){  // Move paddle up
        if (!(myPaddle.offset().top <= arena.offset().top)){  // Make sure paddle isn't at top 
            paddleSpeed -= 8;
        }
    }
    if (keysPressed.down) {  // Move paddle down
        if (!(myPaddle.offset().top+paddleL.height() >= arena.offset().top + arena.height())){  // Make sure paddle isn't at bottom
            paddleSpeed += 8;
        }
    }
    if (paddleSpeed != 0) socket.emit("moveReq", paddleSpeed);   // Send server request to be sent to opponent
    myPaddle.css({top: '+='+paddleSpeed+'px'});   // Move paddle locally
    if (gameInProgress){   // If round has started, move the ball
        ball.css({left: '+='+ballSpeed.hor+'px', top: '+='+ballSpeed.ver+'px'});
        window.requestAnimationFrame(updateFrame);  // Request next frame

是否有人有任何建议来减少我的游戏延迟,或者我的免费层对于这种web应用来说带宽太低了?

应该有足够的带宽来轻松运行这个游戏,所以我认为这不是你的问题


相反,我建议你们看看关于在线游戏开发的博客。当我开始开发多人游戏时,我自己也使用了其中描述的想法。它解释了开发在线游戏时的几个关键问题和解决方案

你住在哪个地区?您的服务托管在哪个地区?你的对手住在哪个地区?这可能是你正在经历的延迟的原因。但是,即使当我在本地主机上尝试这个游戏时,另一台计算机通过wifi连接,它也会延迟。是的,我认为这是我的实现中的一个问题,因为当我通过本地主机运行它并通过wifi连接另一台计算机时,它仍然会延迟。正如我之前链接的博客/文章中提到的,你可能想要添加某种客户端侧预测不依赖于服务器延迟。嗯,这听起来很复杂,但我会尝试一下!
socket.on('moveReq', function(data){
    socket.broadcast.emit("movePaddle", data);  // Send opponent's paddle movement to user
});

socket.on('launchGame', function(){   // Launch the game
    io.sockets.emit('startGame');
});