Большое количество таймеров против одного большого узла таймера JS

#javascript #node.js

#javascript #node.js

Вопрос:

Итак, я создаю приложение (игру) в реальном времени с использованием NodeJS websockets. Существует несколько карт, на каждой из которых есть объекты и игроки, которые всегда должны синхронизироваться.

Я решил использовать несколько таймеров (один интервал для каждого подключенного сокета) вместо использования одного большого таймера, который отправляет пакеты подключенным пользователям в определенных комнатах.

Мой вопрос: является ли это жизнеспособным вариантом иметь несколько небольших таймеров, которые проверяют некоторые значения, связанные с конкретным сокетом, а затем отправляют их обратно клиенту, или я должен использовать один большой таймер, который перебирает все карты (комнаты) и выдает необходимые данные (игроки в комнате,позиционирование, вращение и объекты) в каждую комнату раз в 50 мс

Это примеры:

Несколько таймеров (один / сокет)

 setInterval(function(){
      SYSTEMS[socket.shipData.systemId].players = [];
          //Players
          _.forEach(PLAYERS, function(player, key) {
              if(player.shipData.systemId === SYSTEMS[socket.shipData.systemId].id){

                  //Generating the packets to be sent
                  player.shipData.name = player.userName;
                  var player = player.shipData;

                  // var packet = player.shipData.replace(' ', '');
                  SYSTEMS[socket.shipData.systemId].players.push(player);
              }
          });
      io.to(SYSTEMS[socket.shipData.systemId].id).emit('heartBeat', SYSTEMS[socket.shipData.systemId]);
    },50);
 

Один единственный таймер (перебор всех карт и отправка пакетов каждому)

 setInterval(function(){
_.forEach(SYSTEMS, function(value, key) {
      SYSTEMS[value.id].players = [];
_.forEach(PLAYERS, function(player, key) {

    if(player.shipData.systemId === SYSTEMS[value.id].id){

        //Generating the packets to be sent
        player.shipData.name = player.userName;
        var player = player.shipData;
        SYSTEMS[value.id].players.push(player);
    }
});

//Emitting data to each sepparate system
io.to(SYSTEMS[value.id].id).emit('heartBeat', SYSTEMS[value.id]);
});
},1000/15);
 

Комментарии:

1. Зачем вам это нужно Interval ?

2. Я использую интервал в качестве сердцебиения для отправки пакетов клиентам, но я открыт для других идей

3. Если у вас есть сокет, отправляйте данные при изменении любых соответствующих данных… Имеет смысл?

4. Имеет смысл, если я знаю, какие данные были изменены и на какой карте, но мне не удалось найти какого-либо глубокого наблюдателя, который уведомляет, когда что-то было изменено

5. Это API, который вы разработали, который изменяет данные?