使实时的socket.io Pong游戏更快

3
我刚刚使用node.js和socket.io作为后端,使用jQuery作为客户端实现了游戏Pong。我将游戏放在我的免费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

同时,我的服务器端:

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');
});

有没有什么方法可以减少我的游戏延迟,或者说我的免费套餐对于这种网络应用程序来说带宽太低了?


你居住在哪个 AWS 区域?你的服务托管在哪个区域?你的对手居住在哪个 AWS 区域?这可能会导致你正在经历的延迟问题。 - poida
西海岸北美地区。但是即使我在本地主机上尝试使用另一台通过WiFi连接的计算机玩这个游戏,它仍然很卡顿。 - MarksCode
1个回答

2

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

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


是的,我认为这是我的实现问题,因为当我通过本地主机运行它并通过 WiFi 连接到另一台计算机时,它仍然很卡顿。 - MarksCode
正如我之前链接的博客/文章中所提到的,您可能希望添加某种客户端预测,以减少对服务器延迟的依赖。 - Joakim Ericsson
嗯,听起来挺复杂的,但我会试一试! - MarksCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接