Вопрос по реализации таймеров в геймдеве.

Возьмем какую-нибудь мультиплеерную (это важно) "ферму" или травиан-like стратегию. В ней игроки строят/изучают. Каким образом это реализовано на сервере?

Ниже просто мои размышления.

Допустим, мы делаем табличку с заданиями. Когда игрок нажимает "построить сортир", туда, в табличку, записываем время начала строительства и время его окончания. Так же у нас работает cron, в котором скрипт раз в N времени достает все задачи, проверяет время - и если оно истекло, то удаляет задание из таблички, а в другую делает запись о появившемся "сортире".

Всё это по идее неплохо работает в сингле или на крайне ограниченном количестве игроков. А если их хотя бы пара тысяч и каждый постоянно что-то строит/изучает?

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

Можно пойти другим путем и на каждое задание спавнить тред, в котором будет реализован таймер ожидания. Избавляемся от проблем с периодичностью запуска планировщика, но упираемся в ресурсы. 2-10к тредов с таймерами непонятно во что выльются и скорее всего только рестарт такого монстра будет занимать недопустимое время. Опять тупик.

В общем, хотелось бы увидеть ответ по реализации.

6
14 комментариев