让实时 socket.io Pong 游戏更快
Making real time socket.io Pong game faster
我刚刚完成游戏 Pong 的实现,后端使用 node.js 和 socket.io,客户端使用 jQuery。我将游戏放在我的免费层级 AWS 实例上,机制运行良好,但延迟无法播放。在游戏中,控制它的玩家的球拍就地移动。客户端还发送一个服务器请求,每隔 requestFrameAnimation
向对手广播球拍移动。要发射球,发球的球员按下空格键,发送服务器请求,然后发送给两名球员以开始球的运动。
球拍运动和球发射都存在延迟问题。对于球拍,我认为问题在于我每隔 requestFrameAnimation
发送一次服务器请求,这可能速度太快了。也许我应该设置一个 setInterval,每隔几分之一秒将玩家的球拍位置发送给他的对手。至于球,因为它开始移动的信号是由服务器发送的,我想我需要在按下空格键之前发送球发射的实际时间,这样每台本地机器都可以倒计时到那个时间.
这是我的客户端代码的一些上下文片段:
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');
});
有没有人有任何减少我的游戏延迟的技巧,或者我的免费套餐对于这种网络应用程序来说带宽太低了吗?
应该有足够的带宽来运行这个游戏很容易,所以我认为这不是你的问题。
相反,我建议您查看有关在线游戏开发的 this 博客。当我开始开发多人游戏时,我自己使用了其中描述的想法。阐述了开发网络游戏时的几个关键问题和解决方法。
我刚刚完成游戏 Pong 的实现,后端使用 node.js 和 socket.io,客户端使用 jQuery。我将游戏放在我的免费层级 AWS 实例上,机制运行良好,但延迟无法播放。在游戏中,控制它的玩家的球拍就地移动。客户端还发送一个服务器请求,每隔 requestFrameAnimation
向对手广播球拍移动。要发射球,发球的球员按下空格键,发送服务器请求,然后发送给两名球员以开始球的运动。
球拍运动和球发射都存在延迟问题。对于球拍,我认为问题在于我每隔 requestFrameAnimation
发送一次服务器请求,这可能速度太快了。也许我应该设置一个 setInterval,每隔几分之一秒将玩家的球拍位置发送给他的对手。至于球,因为它开始移动的信号是由服务器发送的,我想我需要在按下空格键之前发送球发射的实际时间,这样每台本地机器都可以倒计时到那个时间.
这是我的客户端代码的一些上下文片段:
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');
});
有没有人有任何减少我的游戏延迟的技巧,或者我的免费套餐对于这种网络应用程序来说带宽太低了吗?
应该有足够的带宽来运行这个游戏很容易,所以我认为这不是你的问题。
相反,我建议您查看有关在线游戏开发的 this 博客。当我开始开发多人游戏时,我自己使用了其中描述的想法。阐述了开发网络游戏时的几个关键问题和解决方法。