Как лучше синхронизовать данные между клиентом и сервером?
Разрабатываю веб-игру используя node.js, javascript и websocket, имеется показатель жизней. По нажатию кнопки должна происходить регенерация, со скоростью 1 HP в 1 сек. Как лучше реализовать механизм регенерации? Варианты:
- Отправить запрос на сервер. Сервер запускает setInterval на 1000 мс. для каждого игрока, который начал регенерацию и каждый цикл отправляет клиенту новое состояние здоровья.
- Запустить на клиенте setInterval на 1000 мс. и отправить запрос на сервер. На сервере сохраняем время начала регенерации и запускаем setTmeout, который должен сработать через время, небходимое для полного восстановления (100 - [хп игрока]) - секунды для полного восстановления.
Может есть другие варианты? Не будет ли первый вариант слишком ресурсозатратным?
Ответы (1 шт):
Автор решения: Артём
→ Ссылка
Для реализации данного способа необходимо логическое представление об отправке данных. Ведь постоянный спам - это не лучшее решение. Давайте окунёмся в мир логики и представим, что на вашем сервере играет 3 игрока.
- Игрок №1 (Обычный игрок, у которого доступна регенерация)
- Игрок №2 (Софтер, который уже нажимал кнопку, но будет спамить на сервер)
- Игрок №3 (Игрок в состоянии регенерации, но задержка скоро закончится)
Как же мы реализуем данную систему?
- Необходимо уже иметь готовый виртуальный таймер на стороне клиентов. Он будет обеспечивать визуальную регенерацию.
- При нажатии на кнопку регенерации необходимо проверить действительно ли указанный игрок имеет право на регенерацию на сервере и отправить запрос о начале регенерации игрока (точнее дату окончания регенерации и дату начала) всем игрокам, в том числе и инициатору. В результате мы будем высчитывать это всё на клиентской стороне, а сервер будет отдыхать.
Теперь самое интересное! Испытание теории:
- Игрок №1 нажимает на кнопку -> сервер (одобряет его действия) -> отправляет всем клиентам сообщение о запуске таймера над головой у Игрока №1.
- Игрок №2 отправляет фейковое-сообщение о регенерации через софт -> сервер (отказывает его действия)
- Игрок №3 закончил регенерацию. У всех игроков автоматически убрался таймер над головой, так как он установлен на стороне клиента и не нужно ничего обновлять.