Ускорение игры socket.io Pong в реальном времени

Я только что закончил реализацию игры 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');
});

Есть ли у кого-нибудь какие-нибудь советы, как уменьшить задержку в моей игре, или у моего бесплатного уровня слишком низкая пропускная способность для такого рода веб-приложений?


person MarksCode    schedule 23.03.2016    source источник
comment
В каком регионе aws вы живете? В каком регионе размещены ваши услуги? В каком регионе aws живет ваш оппонент? Это может способствовать задержке, которую вы испытываете.   -  person poida    schedule 24.03.2016
comment
Западное побережье Северной Америки. Но даже когда я пробую эту игру на своем локальном хосте с другим компьютером, подключающимся через Wi-Fi, он тормозит.   -  person MarksCode    schedule 24.03.2016


Ответы (1)


Пропускной способности должно быть достаточно, чтобы легко запустить эту игру, поэтому я не думаю, что это ваша проблема.

Вместо этого я рекомендую вам взглянуть на этот блог о разработке онлайн-игр. Описанные там идеи я использовал сам, когда начал разрабатывать многопользовательские игры. В нем объясняется несколько ключевых проблем и решений при разработке онлайн-игр.

person Joakim Ericsson    schedule 24.03.2016
comment
Да, я думаю, что это что-то в моей реализации, потому что, когда я запускаю его через свой локальный хост и подключаюсь к другому компьютеру через Wi-Fi, он все еще отстает. - person MarksCode; 24.03.2016
comment
Как упоминалось в блоге/статье, на которую я ссылался ранее, вы, вероятно, захотите добавить какое-то предсказание на стороне клиента, чтобы оно не зависело от задержки сервера. - person Joakim Ericsson; 24.03.2016
comment
Хм, звучит довольно сложно, но я попробую! - person MarksCode; 24.03.2016