Я только что закончил реализацию игры 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');
});
Есть ли у кого-нибудь какие-нибудь советы, как уменьшить задержку в моей игре, или у моего бесплатного уровня слишком низкая пропускная способность для такого рода веб-приложений?