Я только что сделал многопользовательскую браузерную реализацию игры Pong, используя socket.io, и у меня есть вопрос относительно логистики в реальном времени. По сути, ракетка игрока — это просто цветной div, который перемещается вверх или вниз в зависимости от того, какую кнопку он нажимает. При тестировании моей программы на двух разных компьютерах с использованием AWS я заметил, что движение было почти идеально синхронизировано, но иногда не точно. Для игрока, который управляет ракеткой, движение ракетки выполняется локально, но для человека, против которого он играет, сервер постоянно отправляет ему данные о том, двигался ли его противник вверх или вниз.
Мой вопрос: должен ли я выполнять все движения на стороне сервера? Например, пользователь нажимает, чтобы подняться, и он отправляет серверу запрос, который отправляет обоим игрокам, что весло должно двигаться, или мой способ, когда движение вашего весла выполняется локально нормально?
Мой код сейчас выглядит так:
Клиентская сторона проверяет, нажата ли кнопка вверх или вниз, и выдает запрос на перемещение:
paddleMove = 0; // Keep track of which direction to move
speed = 5;
if (paddleL.position().top > arena.position().top){ // If left paddle not at top
if (keysPressed.up) paddleMove -= speed;
}
if (paddleL.position().top+paddleL.height() < arena.position().top + arena.height() - 15){ // If left paddle not at bottom
if (keysPressed.down) paddleMove += speed;
}
paddleL.css({ // Move paddle locally
top: paddleL.cssNumber('top') + paddleMove + 'px'
});
socket.emit("moveReq", paddleMove); // Send to server
Приведенный выше код находится в интервале, который выполняется каждую долю секунды.
Тогда серверная часть выглядит так:
socket.on('moveReq', function(data){ // Send to opponent that other paddle moved
socket.broadcast.emit("movePaddle", data);
});
Что, в свою очередь, предупреждает другую часть пользовательского кода о перемещении другой ракетки:
socket.on("movePaddle", function(data){
var paddleMove = 0;
paddleMove += data; // Data is speed (direction) of movement
paddleR.css({ // Move right paddle
top: paddleR.cssNumber('top') + paddleMove + 'px'
});
Как я уже сказал, движение сейчас довольно хорошее, но не идеальное. Должен ли я не делать никаких движений локальными и делать все это на сервере?