170 похожих чатов

Подскажите, по какому принципу в "стратегиях"(играх) типа "Веселая ферма" устроено

несколько миллионов таймеров? Допустим я "запустил стройку" или "посадил морковку" и мне говорят что через 7 минут будет готово. И таких таймеров в игре почти по количеству "площади" (сотни), а в пределах многопользовательского режима - миллионы... обычный setTimeout вроде не разумно уже использовать! B через setInterval не разумно раз в секунду "долбить" миллионЫ элементов в SQL запросе.

56 ответов

167 просмотров

в целом на джаваскрипте делать такое не разумно, думай в этом направлении

Один таймер раз в секунду проверяет что произошло нового

Andriy-F Автор вопроса
A Z
в целом на джаваскрипте делать такое не разумно, д...

С каких пор JS перестал быть "полноценным языком"? Вопрос лишь в алгоритмах...

Andriy F
С каких пор JS перестал быть "полноценным языком"?...

я где-то сказал что JS перестал быть "полноценным языком"?

Andriy-F Автор вопроса
Sergey 🧻🤲
Один таймер раз в секунду проверяет что произошло ...

Хочу хоть какую-нибудь оптимизацию! Пока смотрю в сторону "закешировать ближайшую" и ждать только один таймаут, а потом искать следующую ближайшую.

Andriy-F Автор вопроса
A Z
я где-то сказал что JS перестал быть "полноценным ...

А как еще можно понять "в целом на джаваскрипте делать такое не разумно, думай в этом направлении"? Значит "есть языки получше"? Те на которых это можно сделать в отличии от JS? JS экранирован от "нативных команд ОС/оборудования" (в отличии от Си, ассемблера и возможно "компилируемых" типа паскаля, го), но это единственный "недостаток". Для 10М таймеров не нужен "прямой доступ к процессору", Вопрос лишь в алгоритмах... К тому-же не уверен что ВСЕ онлайн стратегии сделаны не на Ноде!

Andriy F
А как еще можно понять "в целом на джаваскрипте де...

если ты не можешь понять как сделать нормально и хочешь на сервере запустить миллионы таймеров на джаваскрипте, то "в целом на джаваскрипте делать такое не разумно"

можешь заюзать условный priority queue по времени (вставка нового action будет стоить log n соотв), раз в n времени (секунда, полсекунды, 100 мс..) забирать из priority queue элементы, у которых endTime >= currentTime, они всегда будут первыми в такой очереди

Andriy F
А на чем тогда?????

на бумажке, настолку лучше сделай, а потом наберешься опыта, переосмыслишь свой подход и тогда уже сделаешь нормально

Andriy-F Автор вопроса

Примерно так и думал сделать... Вопрос скорее - как у ДРУГИХ это сделано? Это уже должно быть неким "патерном" со времен древних стратегических игр с сотнями юнитов, да еще и в онлайне...

Andriy-F Автор вопроса
A Z
на бумажке, настолку лучше сделай, а потом набереш...

Не говорите глупости! Мне ПАТЕРН нужен, а не "настолку на бумажке". Я не игру пишу, а онлайн сервис (да хотя-бы телеграмм-бот) где у каждого пользователя может быть от одного до... (понятия не имею, но до 50 точно) таймеров, которые должны сделать "пуш". И не знаю сколько десятков-сотен-тысяч пользователей может быть в системе. ПОКА что обычный таймаут справляется на одном ядре в ноде. Но не хочу чтобы сервак ТОЛЬКО "за будильником следил".

Andriy F
Примерно так и думал сделать... Вопрос скорее - ка...

по сути так у других и реализовано, как же иначе? почекай ещё hashed wheel timers, может тебе такое решение больше подойдёт

Andriy F
Примерно так и думал сделать... Вопрос скорее - ка...

а то решение через priority queue, которое я сразу предложил, я сейчас вспомнил, называется calendar queue можешь ещё про soft heap почитать

Andriy-F Автор вопроса
Andriy F
Спасибо! Не знал что гуглить...

и в принципе почитай про то, как работать с discrete-event simulation, я уверен, что найдёшь какие-то работы и видео на эту тему, с конференций точно должно что-то быть

Andriy-F Автор вопроса
o0
и в принципе почитай про то, как работать с discre...

Ух, "загрузили"... Я думал простенький патерн, а там... )))

A Z
в целом на джаваскрипте делать такое не разумно, д...

Вполне разумно. Одно из первых игр такого типа в ВК делали как раз на ноде, ещё и версии 0.х

Алексей Попов
Вполне разумно. Одно из первых игр такого типа в В...

если игрушка нагружена, как писал тот кому я ответил, то мне кажется не очень разумно

Andriy F
Не говорите глупости! Мне ПАТЕРН нужен, а не "наст...

Ты подумай о том, что будешь делать, если процесс упал/нода переехала, и все твои таймеры пропали Очевидно же что таймер не нужен

A Z
если игрушка нагружена, как писал тот кому я ответ...

А мне кажется для игр такого плана нода может быть оптимальным выбором. Вряд ли там есть cpu intensive

Andriy-F Автор вопроса
Алексей Попов
Ты подумай о том, что будешь делать, если процесс ...

Понятно что данные на 99% лежат в базе... Вопрос был как их оттуда вытягивать и обрабатывать - логично что не по таймеру для каждой 10М задач, и не ежесекундным опросом базы. Я в принципе уже сделал, но на всякий случай сюда спросил чтобы на "велосипедность" проверить - вдруг есть решение более логичное/простое. Или наоборот более сложное но надежное. Сейчас при запуске ищу в базе "ближайшую", и настраиваю таймаут на это событие. После срабатывания - настраиваю на следующее. Там есть нюанс с колбэками и долгой обработкой одного события, но в принципе все работает. Отладку проводил в браузере - выяснил одну пакость JS - если страница уходит в "не активную закладку", то браузер может ЗАДЕРЖИВАТЬ таймаут! (не "останавливает", а именно "задерживает") Причем СИЛЬНО! Учился на малых таймаутах в пределах 5-15 сек и получал "задержку" таймаута до 3х минут! Сейчас пишу "обнадеживатель" таймаута... Поэтому и возник вопрос по "игровым таймерам" - там обычно не бывает таких багов.

Andriy F
Понятно что данные на 99% лежат в базе... Вопрос б...

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

Andriy-F Автор вопроса
Алексей Попов
Так в ноде тоже нет никакой гарантии, что таймер о...

Не "любой"! Если разброс в 10 раз на секундах, то на "часах" может оказаться в несколько СУТОК! А "критично" уже больше 10 минут... Поэтому продумываю "дублирующие" таймеры, которые "погрешность" попытаются исправить...

Andriy F
Не "любой"! Если разброс в 10 раз на секундах, то ...

Яннп, но всё же любой. Потому что ты можешь банально синхронной операцией заблочить ивент луп на год, и таймер, установленный на две секунды, у тебя сработает только через год А идея с таймерами, которые дублируют другие таймеры и правят погрешности, это просто 🔥, да. Потом понадобятся таймеры, которые корректируют корректирующие таймеры, и таймеры, которые корректируют корректирующие корректирующие таймеры 👍👍👍

Andriy-F Автор вопроса
Алексей Попов
Яннп, но всё же любой. Потому что ты можешь баналь...

В ноде (насколько понял) не принято блочить ивент-луп тяжелыми задачами! Но вот ОС может решить выделить слишком мало ресурсов Ноде и та "заснет". Это правда лишь предположение... Но в БРАУЗЕРЕ может происходить что угодно! Я пишу механизм который будет работать с большим кво таймеров и на Ноде, и в Браузере и в NWjs и даже (в идеале) в андроиде(который любит поспать). Если у меня ОДИН таймаут "до ближайшей", который может "прыгать" от 0.1 сек до 70 часов... Почему-бы не запустить еще 1-2 которые раз в 5 минут (или в 1/3 таймаута) будут проверять "не отстает ли таймаут"

Andriy F
В ноде (насколько понял) не принято блочить ивент-...

не принято - не значит что ты 100% не будешь его блочить если ты сделаешь второй таймер чтоб тот следил за первым, то как ты будешь проверять что первый затормозил если второй затормизит тоже когда ты залочишь луп?

второй надо пускать в воркер треде просто) и из него мессаги слать первому)

Anton K.
второй надо пускать в воркер треде просто) и из ...

ну, вот он запустит второй таймер в другом треде, а в основном будет работать по первому таймеру и ждать событие из второго на проверку и тут бац, основной тред залочится, событие отловится только через секунду (или час), кому верить?

Алексей Попов
Яннп, но всё же любой. Потому что ты можешь баналь...

а потом вынести это в два микросервиса. Первый коронный - второй контрольный

A Z
ну, вот он запустит второй таймер в другом треде, ...

Нужно отправлять синхронизирующее событие по какому-нибудь вебсокету, если есть уверенность, что браузер сам троттлит таймеры

Andriy-F Автор вопроса
A Z
не принято - не значит что ты 100% не будешь его б...

Представь что ты "первому" таймеру дал задачу разбудить тебя когда на часах будет 7 утра. "Первый таймер" завел старый механический будильник, который может отставать. На всякий случай "второй таймер" должен по тому-же будильнику проснуться через 3 часа и проверить время - если его разбудили не через 3.01, а через 4-5 часов - значит первому надо ввести "поправку" и перевести будильник так чтобы сработать ДО того как ты "опаздаешь на работу" ))) Я не "таймерный маньяк"! ))) Просто сильно взбесило что в браузере настроил выводить в консоль каждые 10-30 секунд и обнаружил что он "так и быть" выводит туда каждые 3-5 минут... А если бы это был таймер на нечто ВАЖНОЕ?

A Z
ну, вот он запустит второй таймер в другом треде, ...

если в момент х всё залочится на основном треде то уже ничего не спасёт

Сергей Пограничный
Нужно отправлять синхронизирующее событие по каком...

а если он сожрет память или залочит процесс в браузере? браузер встанет пока не разберется с текущими задачками и отработает по события только через время

Anton K.
если в момент х всё залочится на основном треде то...

ну и ну, вот это вывод, а гражданин f все еще хочет юзать таймеры

Andriy F
Представь что ты "первому" таймеру дал задачу разб...

а ты в курсе как евент луп работает? nodejsный а не браузерный

Andriy-F Автор вопроса
A Z
https://t.me/nodejs_ru/1142527

Я хочу снизить риск не от СВОИХ багов в коде, а баги ОС (или браузера). Залочить тред - это "мои кривые руки". Но если я завел будильник на хостинге, а он в это время решил запустить фоновую задачку и таймеры начали СИЛЬНО отставать...

Andriy F
Я хочу снизить риск не от СВОИХ багов в коде, а ба...

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

Andriy F
В ноде (насколько понял) не принято блочить ивент-...

Не принято не значит, что синхронных операций вообще нет. У тебя время таймера может сработать тогда, когда el занят обработкой запроса, в котором надо сделать json parse для сложной структуры, а потом ещё reduce для результата - и никакой точности таймера не будет

Andriy-F Автор вопроса
A Z
остается только пожелать тебе удачи выкладывай ко...

Там слишком сильно "интегрированный в проект" код для гитхаба. Сейчас переделываю свой домашний NWjs сокет-сервер чтобы он нотифы выдавал при входящих отправляемых таймером. "независимый" тестер, которым можно будет праверить если в РАЗНЫХ браузерах и в ноде будут сильные погрешности со временем на больших интервалах (в часах). Проект не "горящий" - недельку буду приглядывать и делать выводы...

Andriy-F Автор вопроса
Алексей Попов
Не принято не значит, что синхронных операций вооб...

Я же говорил - мне не критичны "миллисекунды" (или даже минута, на тяжелый процесс в евентлупе), но если таймер отстанет на пару часов... При том что браузер или ОС просто решили "сберечь заряд аккумулятора" или "нагрев процессора"... Я провожу разработку/отладку на секундах-минутах. А работать оно должно на часах или даже сутках. Как-то не правильно будет обнаружить такой баг уже на релизе!

Andriy F
Там слишком сильно "интегрированный в проект" код ...

Ну это вряд ли коммерческий или ценный проект, много не потеряешь если выложишь его в гитхаб

Andriy-F Автор вопроса
A Z
Ну это вряд ли коммерческий или ценный проект, мно...

Конечно коммерческий! Только "без дедлайна". И модуль "интеграцией" идет. Правда пока в "не активном" режиме - рабочие выходы на внешние тестеры и в консоль. пускаю.

Andriy F
Конечно коммерческий! Только "без дедлайна". И мод...

тогда передаю лучи поддержки твоему тим лиду и тех диру

Andriy F
Я же говорил - мне не критичны "миллисекунды" (или...

Тогда по прежнему актуален вопрос с рестартом процесса Плюс таймауты могут накапливать отставание, если у тебя логика построена на их перезапуске Возможно таймауты для такой задачи плохое решение. Не зря тут уже час бурлит

Andriy-F Автор вопроса
Алексей Попов
Тогда по прежнему актуален вопрос с рестартом проц...

Есть "системное время" от которого задаются таймауты и идет "математика расчетов". А есть "следующее срабатывание", которое выполняется на колбэк таймаута или тайминтервала. Хранение "времени следующего срабатывания" в базе или в таблице памяти. Если "математику расчетов" разбудят СЛИШКОМ поздно, то будет критично... Это всетаки таймеры для сотрудников на производстве, а не "игрушка".

Andriy F
Понятно что данные на 99% лежат в базе... Вопрос б...

Именно когда вкладка не активна, а когда переключаетесь на вкладку, то таймеры нормально работают таймеры?

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Oh sorry did you want it in Gunter's chains?
Martin Rys
15
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта