我刚刚使用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');
});
有没有什么方法可以减少我的游戏延迟,或者说我的免费套餐对于这种网络应用程序来说带宽太低了?