Как происходит начисление ресурсов в онлайн играх (травиан)?
Привет и спасибо за потраченное время!
Я ничего не понимаю в разработке игр, но мне хотелось бы понять как работает начисление ресурсов в онлайн играх как травиан. Рассмотрим ресурс "дерево" и строительство военных юнитов.
Дано:
- Игровой сервер имеет n пользователей и у каждого пользователя своя скорость добычи ресурсов.
- Пользователь имеет скорость добычи дерева 60ед/мин
- Пользователь строит военных юнитов в количестве 1000штук и скоростью 1юнит в 90секунд
Условия:
- Ресурсы должны начисляться каждую секунду;
- Начисление военных юнитов происходит после готовности 1 юнита, а не заказанной "пачки"
Как вижу я:
- Имеем "ресурсный" сервер для обслуживания 1000 пользователей. При старте он рассчитает кол-во начисляемых единиц дерева в секунду для каждого пользователя. Теперь проходим всех пользователей каждую секунду и просто увеличиваем на нужное количество единиц и в конце цикла флашим изменения в хранилище;
- По аналогу имеем сервер "военных юнитов". Когда пользователь заказывает строительство юнитов на сервер попадает "транзакция" . Транзакция - это структура данных с информацией о (типе юнита, требуемом количестве, скорости строительства, количестве уже построенных юнитов и времени последнего построенного юнита). Теперь аналогично каждую секунду проходим по транзакциям и проверяем можем ли увеличить счетчик юнитов на 1, думаю данных из транзакции должно хватить. В конце цикла флашим изменения в хранилище.
Так ли это должно работать и если нет, то кто может рассказать и объяснить как должно? Ссылки по теме приветствуются :)
Нет, неправильно. Подобные вещи работают по модели событий. Игрок входит в игру - игра отправляет событие на сервер, сервер вычисляет все изменения за время оффлайна.
Сам по себе игрок играет в чёрный ящик с кнопками. Игра начинается, когда нажимается кнопка. Чёрный ящик (сервер) обрабатывает действие и результаты предыдущих действий (все подобные игры пошаговые, даже если у вас там какие-то таймеры отображаются). Возвращает красивую картинку.
Если исключить из ответа оффлайн и оставить условие что всегда онлайн, то в каком момент должен происходить пересчет всей информации? С каждым пользователем может взаимодействовать n других пользователей. Событийная архитектура выглядит очень сомнительно.