2014-09-30 3 views
1

Я разрабатываю игру, используя Socket.IO. Я нахожу, что задержки очень высокие, т.е. 250 миллисекунд, даже при работе на localhost. Это нормально ?Высокие задержки в Socket.IO

Вот код, я использую для расчета задержки:

function startLatencyPoller(socket,callback) 
    { 
     setInterval(function() { 
     var startTime = Date.now(); 
     socket.emit('ping'); 
     socket.on('pong', function() { 
     latency = (Date.now() - startTime) /2; //round trip time/2 
     callback(latency); 
    }); 
}, 2000); 

} 

Мой вопрос, является ли его нормальным Socket.IO иметь латентности столь же высоко как 250 мс даже в локальной сети, и есть ли являются способами его дальнейшего уменьшения.

EDIT: Я проверил транспорт, и прямо сейчас я использую websocket в качестве транспорта.

EDIT: Проблема была решена после редактирования коды в соответствии с ниже ответа (удаление слушателя избежать их нагромождения):

setInterval(function() { 

    var startTime = 0; 
    var socketFunction = function() { 
     latency = (Date.now() - startTime) /2; //round trip time/2 
     callback(latency); 
     socket.removeListener('pong',socketFunction); 
    }; 

    socket.on('pong', socketFunction); 
    startTime = Date.now(); 
    socket.emit('ping'); 


}, 5000); 
+0

Нет, это не нормально. Трудно сказать, где может быть причина. Что такое латентность, если вы используете обычный пинг в терминале? – DerM

+0

Локальные пинты очень быстрые, менее 1 мс. Я не уверен, как диагностировать это. – coderboy

+0

Im работает в 250 мс, даже когда я использую localhost на той же машине. Это согласовано даже на разных машинах, в которых я это пробовал. Даже если вы ударили его с другого компьютера в той же сети, он по-прежнему не будет меньше среднего значения в 250 мс. – coderboy

ответ

2

Существует проблема с этой функцией. Если вы установите интервал в socket.on, это означает, что вы добавляете много слушателей к одному и тому же событию, и это будет увеличивать выполнение на каждой итерации. Итак, прежде всего, удалите этот socket.on за пределами setinterval. Разве и ваш код не блокирует? Предполагая, что ваш процессор не забит другими работами, это может быть какое-то другое событие, задерживающее его.

+0

Большое вам спасибо за ваш ответ !! Вы да реальный MVP: D. Я обновил свой вопрос, показывая, как исправить это, используя ваш совет. – coderboy

+0

нет беспокойство. полезно помочь – Dslayer

0
  1. Убедитесь, что вы дождались секунды или около того, прежде чем измерять пинг, поскольку исходный соединительный разъем может засорить системные ресурсы, что приведет к более длительному времени пинга. Возможно, вы захотите добавить таймер к вашей проверке ping.
  2. Локальная программа/среда разработки должна иметь некоторый служебный пинг, поскольку это, вероятно, не выделенный веб-сервер.
Смежные вопросы