Size: a a a

Node.js — русскоговорящее сообщество

2019 October 19

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Воот, уже "власть пошла" ))) я же говорю, смешное поведение. Админ же типа "всегда прав", а все остальные "твари дрожащие"...
Когда люди хотят помочь и вникнуть, то СНАЧАЛА уточняют, а потом отвечают, а не пытаются высосать из пальца совершенно лишнюю информацию (часть которой есть в вопросе, к слову), вместо того, чтобы более вдумчиво перечитать вопрос
источник

NJ

No Joke in Node.js — русскоговорящее сообщество
Чувак, ты прикалываешься? Тебе предложили ответ уровня говна с палками или нормальное решение, но требующее уточнения.
источник

N

Nelkor in Node.js — русскоговорящее сообщество
Artem Zuev
Всем вечерочка бодрого. Вопрос для теоретиков ;)
Исходные данные - установленное WS-соединение с сотней клиентов
В секунду каждому клиенту отправляется от 2 до 5  (в среднем 3) пакетов с данными и должен придти в ответ пакет с результатом в течение 3 секунд

Т.к. это не HTTP-REST (или подобное), то отлавливать таймаут на ответ необходимо своими силами. Варианты реализации:
- при запросе создается таймер setTimeout() который отслеживает приход времени и срабатывает один раз во время наступления нужного момента. Итого имеем в максимуме 100 * 3 * 3 = 900 таймеров единомоментно, плюс постоянные процедуры создания/удаления таймеров по мере отправки запросов/получения ответов
- инициируется один таймер setInterval с интервальностью не более 50мс (т.е. 20 вызовов в сек), который проходит по всем "ждунам" (как выше писал около 900 в худшем варианте) и проверяет их "статус таймаута". Итого нет постоянных пересозданий, но есть риск в случае даже небольшой задержки в проходе, наслоения вызовов...
- третий вариант по сути разновидность второго с той лиш разницей, что вместо разового создания setInterval используется setTimeout - тем самым исключается наслоение циклов, но возвращается проблема постоянного пересоздания таймеров, просто в этом варианте он будет один, но "короткий"
В любом случае 1 таймер на 900 проверок лучше, чем 900 таймеров по одной проверке на каждый.
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Nelkor
В любом случае 1 таймер на 900 проверок лучше, чем 900 таймеров по одной проверке на каждый.
да я тоже так думал, пока не дочитал до масштабов проверок. 900 таймеров, но сработает каждый из них только один раз - когда его время придет (но создаваться/удаляться они будут сплошным "потоком"), или таймер один, но будет срабатывать каждые 50мс (не удалось договориться даже до интервала в 100мс)
источник

go

government of usa in Node.js — русскоговорящее сообщество
Artem Zuev
да я тоже так думал, пока не дочитал до масштабов проверок. 900 таймеров, но сработает каждый из них только один раз - когда его время придет (но создаваться/удаляться они будут сплошным "потоком"), или таймер один, но будет срабатывать каждые 50мс (не удалось договориться даже до интервала в 100мс)
Очевидно вариант 2
источник

АП

Алексей Попов in Node.js — русскоговорящее сообщество
No Joke
Чувак, ты прикалываешься? Тебе предложили ответ уровня говна с палками или нормальное решение, но требующее уточнения.
Просто интересно, а что из предложенного чем является в твоей терминологии?
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Алексей Попов
Просто интересно, а что из предложенного чем является в твоей терминологии?
не обращай внимания - тут явное не внимательное чтение от источника, а тупо просмотрел с десяток сообщений "вверх" и сделал выводы
источник

АП

Алексей Попов in Node.js — русскоговорящее сообщество
Artem Zuev
да я тоже так думал, пока не дочитал до масштабов проверок. 900 таймеров, но сработает каждый из них только один раз - когда его время придет (но создаваться/удаляться они будут сплошным "потоком"), или таймер один, но будет срабатывать каждые 50мс (не удалось договориться даже до интервала в 100мс)
А ты замерял сколько уходит времени на задачу - пройти по объекту, сравнить время, сгенерировать событие если тайм-аут истёк?
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Алексей Попов
А ты замерял сколько уходит времени на задачу - пройти по объекту, сравнить время, сгенерировать событие если тайм-аут истёк?
нет - тут видишь в чем еще сложность - по сути вся задача большая и распределяется лидом на мелкие куски, которые он раздает по людям в порядке их необходимости для составления полной реализации (это он сам делает)... так что я даже не знаю, для чего это с такими жесткими требованиями, но по какой-то причине это даже вынесено в отдельный блок ТЗ...

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

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
тогда проход на каждой итерации проверки будет уже не по 900 значениям, а только по 10-20 может быть, а то и того меньше...
источник

MM

Mike Mulukin in Node.js — русскоговорящее сообщество
Artem Zuev
нет - тут видишь в чем еще сложность - по сути вся задача большая и распределяется лидом на мелкие куски, которые он раздает по людям в порядке их необходимости для составления полной реализации (это он сам делает)... так что я даже не знаю, для чего это с такими жесткими требованиями, но по какой-то причине это даже вынесено в отдельный блок ТЗ...

тут еще появилась мыслишка чуток усложнить саму структуру хранения этих флагов/таймаутов - раскидать на два блока:
- использовать время таймаута в качестве ключа в списке рабочих объектов
- а в Set писать только эти ключи, он же вроде как очень быстро работает именно с сортированными значениями и тогда проход не придется делать по всему списку, а только с начала и до первого, который больше текущего времени
не знаю, может не в кон. но я бы сделал как игровых js движках - один объект (state) для хранения флагов и  цикл с интервалом каким удобно, но пусть будет 16 мс. и он будет каждую раз проверять некий объект где все флаги висят. Т.е. сокет отправили - что то запушили в state - пришел ответ - этот флаг удаляем. А цикл в свою очередь будет дельту прибавлять и если у флага больше чем надо интервал то что то делать уже как надо.
источник

MM

Mike Mulukin in Node.js — русскоговорящее сообщество
Artem Zuev
нет - тут видишь в чем еще сложность - по сути вся задача большая и распределяется лидом на мелкие куски, которые он раздает по людям в порядке их необходимости для составления полной реализации (это он сам делает)... так что я даже не знаю, для чего это с такими жесткими требованиями, но по какой-то причине это даже вынесено в отдельный блок ТЗ...

тут еще появилась мыслишка чуток усложнить саму структуру хранения этих флагов/таймаутов - раскидать на два блока:
- использовать время таймаута в качестве ключа в списке рабочих объектов
- а в Set писать только эти ключи, он же вроде как очень быстро работает именно с сортированными значениями и тогда проход не придется делать по всему списку, а только с начала и до первого, который больше текущего времени
вот примерный код :
function GameServer() {
 this.run = true;
 this.entityes = [];
 this.tickLengthMs = 1000/30;
 this.previousTick = Date.now();
 this.actualTicks = 0;
 this.worldW = 600;
 this.worldH = 600;

   this.start = function(id) {
     this.id = id;
      setTimeout(this.gameLoop.bind(this), 1);
   Games.push({id:id,game:this});
   };

   this.gameLoop = function () {
       if (!this.run) return;
       // Timer
       var now = Date.now();

     this.actualTicks++;

     if (this.previousTick + this.tickLengthMs <= now) {
         var delta = (now - this.previousTick) / 1000;
         this.previousTick = now;
         this.update(delta);
         infoblock.text('delta '+delta+' (target: ' + this.tickLengthMs +' ms) node ticks: '+this.actualTicks);
         this.actualTicks = 0;
      }

     if (Date.now() - this.previousTick < this.tickLengthMs - 16) {
       setTimeout(this.gameLoop.bind(this),16);
     } else {
       setTimeout(this.gameLoop.bind(this),1);
     }
   },  this.update = function(delta) {
   var arr = this.entityes;
   arr.forEach(function(item, i, arr) {
     item.entity.update(delta);
     
   });
 }
ну итд в функцию update мы передаем дельту - т.е. интервал между итерациями и уже прикручиваем какую то логику. а сами флаги суем в  массив  entityes
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Mike Mulukin
не знаю, может не в кон. но я бы сделал как игровых js движках - один объект (state) для хранения флагов и  цикл с интервалом каким удобно, но пусть будет 16 мс. и он будет каждую раз проверять некий объект где все флаги висят. Т.е. сокет отправили - что то запушили в state - пришел ответ - этот флаг удаляем. А цикл в свою очередь будет дельту прибавлять и если у флага больше чем надо интервал то что то делать уже как надо.
по сути тоже к варианту 2 склоняетесь, получается
источник

MM

Mike Mulukin in Node.js — русскоговорящее сообщество
Artem Zuev
по сути тоже к варианту 2 склоняетесь, получается
ну в геймдеве вроде так делают - там тоже куча всяких объектов и нет смысла миллион таймаутов ставить, там один все делает
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
хотя нет, такая реализация скорее вариант 3 получается, но даже он в принципе по таймерам получается лучше 1...
источник

ТК

Таймураз Кайтмазов in Node.js — русскоговорящее сообщество
Artem Zuev
Воот, уже "власть пошла" ))) я же говорю, смешное поведение. Админ же типа "всегда прав", а все остальные "твари дрожащие"...
Когда люди хотят помочь и вникнуть, то СНАЧАЛА уточняют, а потом отвечают, а не пытаются высосать из пальца совершенно лишнюю информацию (часть которой есть в вопросе, к слову), вместо того, чтобы более вдумчиво перечитать вопрос
Артем, еще одно кривое слово и я тебе выдам РО
источник

ТК

Таймураз Кайтмазов in Node.js — русскоговорящее сообщество
Последнее китайское
источник

MM

Mike Mulukin in Node.js — русскоговорящее сообщество
Artem Zuev
хотя нет, такая реализация скорее вариант 3 получается, но даже он в принципе по таймерам получается лучше 1...
там код не новый я для браузера чисто в демо целях писал , если надо скинуть могу архив. но мне кажется именно для вашей задачи самое то все-таки
источник

AZ

Artem Zuev in Node.js — русскоговорящее сообщество
Mike Mulukin
там код не новый я для браузера чисто в демо целях писал , если надо скинуть могу архив. но мне кажется именно для вашей задачи самое то все-таки
да нет, спасибо - детали не требуются, сама суть понятна - это голавное. А какой объем "прохода" держит ваш код без фризов и накладываний?
источник

ТК

Таймураз Кайтмазов in Node.js — русскоговорящее сообщество
Mike Mulukin
вот примерный код :
function GameServer() {
 this.run = true;
 this.entityes = [];
 this.tickLengthMs = 1000/30;
 this.previousTick = Date.now();
 this.actualTicks = 0;
 this.worldW = 600;
 this.worldH = 600;

   this.start = function(id) {
     this.id = id;
      setTimeout(this.gameLoop.bind(this), 1);
   Games.push({id:id,game:this});
   };

   this.gameLoop = function () {
       if (!this.run) return;
       // Timer
       var now = Date.now();

     this.actualTicks++;

     if (this.previousTick + this.tickLengthMs <= now) {
         var delta = (now - this.previousTick) / 1000;
         this.previousTick = now;
         this.update(delta);
         infoblock.text('delta '+delta+' (target: ' + this.tickLengthMs +' ms) node ticks: '+this.actualTicks);
         this.actualTicks = 0;
      }

     if (Date.now() - this.previousTick < this.tickLengthMs - 16) {
       setTimeout(this.gameLoop.bind(this),16);
     } else {
       setTimeout(this.gameLoop.bind(this),1);
     }
   },  this.update = function(delta) {
   var arr = this.entityes;
   arr.forEach(function(item, i, arr) {
     item.entity.update(delta);
     
   });
 }
ну итд в функцию update мы передаем дельту - т.е. интервал между итерациями и уже прикручиваем какую то логику. а сами флаги суем в  массив  entityes
Нюанс
 this.entityes = [];
Должно быть entities
источник