C#. Как реализовать выполнение действий на сервере в real-time?

Давайте опишу суть вопроса на примере многопользовательской онлайн-игры. Допустим имеем некоторою игру, где имеется функционал "построить юнит". Данный юнит строится не сразу, а n-ое количество времени (5 минут, допустим). Пользователь-игрок инициирует постройку юнита. Как на стороне сервера можно (а лучше, как нужно?) реализовать данное "отложенное событие", чтобы через пять минут количество юнитов у игрока увеличилось на один?

Что для этого лучше всего использовать и в какую сторону смотреть: quartz, timer, etc?
  • Вопрос задан
  • 632 просмотра
Пригласить эксперта
Ответы на вопрос 4
real time не бывает практически, windows не риал тайм система.
Раз вопрос про игру, посмотрите видео:
1) Написание игрового сервера и создание клиента на U...
2) Создание Counter Strike. Сетевой FPS shooter на Un...
Ответ написан
@epeshk
Никаких таймеров на сервере не нужно.
Записывается время, когда юнит будет построен. А весь процесс строительства юнита - лишь отрисовка на клиенте.
Ответ написан
@MADm
На реальном примере браузерки:
1 при начале крафта пишем в базу что игрок крафтит(чтобы залокать его), и пишем datetime когда конец крафта
2 на клиенте запускаем обратный таймер который раз в н сек опрашивает сервер что там крафтом, сервер возвращает разницу между текущим серверным временем и временем конца крафта, клиент смотрит разницу между клиентским обратным отсчетом и серверным, если нужно корректирует.
3 на сервере есть таймер который раз в н сек достает всех игроков у которых время конца крафта уже прошло по сравнению с текущим временем, запускает для каждого обработку конца крафта. у меня таймер висел в статике на старте приложения и залокан чтоб не пробуксовывал. но мне кажется такое решение плохое и лучше использовать owin типа quartz или вообще службу windows
Ответ написан
Ogoun
@Ogoun
Programmer
Уже выкладывал тут код для подобного вопроса, такое решение мне нравится низким потреблением ресурсов, на все про все один таймер. Работает стабильно. Состояние можно легко свопить на диск и восстанавливать, при рестарте сервера.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы