Улучшение узла с Express Websocket Ping? - PullRequest
0 голосов
/ 06 февраля 2020

Я работаю над игрой, в которой вы сканируете 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';
  }
});

Любая помощь в том, как я могу ускорить время отклика, будет принята с благодарностью! Это мой первый эксперимент с веб-сокетами, поскольку необходимость в низком пинге могла бы откусить больше, чем я могу пережевать:)

1 Ответ

0 голосов
/ 07 февраля 2020

Я не знал, что для каждого звонка нужен собственный запрос XMLHttp, я использовал глобальный - спасибо jfriend00 за руководство!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...