Я работаю над игрой, в которой вы сканируете QR-код на телевизоре, который загружает контроллер на ваш телефон и передает действия игрока через веб-сокет. Функционально это просто передает значение ползунка диапазона на телевизор, чтобы представить координату оси игрока.
Я сталкиваюсь с проблемой, когда время отклика невелико. Около 200 мс задержка между действием и реакцией.
Я использую узел с express и библиотеку socket.io. Я на бюджетном сервере Digital Ocean с установкой в один клик node.js и уже установил регион как можно ближе к своему физическому местоположению.
Хотя я не могу поделиться действительной ссылкой из-за характер назначения, код обработки сообщений ниже:
Приложение. js:
var server = require('http').Server(app);
var io = require('socket.io')(server, { wsEngine: 'ws' });
app.use(function(req, res, next){
res.io = io;
next();
});
app.get('/move/:id/:pos', function(req, res, next) {
res.io.emit("move", {id: req.params.id, pos: req.params.pos});
res.send('move player');
});
Управление. js:
function connectSocket(){
//Browser compatibility check
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
}
else if (window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) {}
}
}
req = new XMLHttpRequest();
}
function startGame(){
connectSocket();
req.open("GET", "start/"+myID, true);
req.send(null);
controlLoop = setInterval(function(){
movePlayer(mySlider.value);
}, 20);
}
let lastPos = 0;
function movePlayer(myPos){
if(myPos != lastPos){
req.open("GET", "move/" + myID + "/" + myPos, true);
req.send(null);
}
lastPos = myPos;
}
Геймплей. js:
socket.on('move', function(data){
if(data.id == myID){
myPlayer.style.top = (data.pos/100)*(window.outerHeight - 300) + 'px';
}
});
Любая помощь в том, как я могу ускорить время отклика, будет принята с благодарностью! Это мой первый эксперимент с веб-сокетами, поскольку необходимость в низком пинге могла бы откусить больше, чем я могу пережевать:)