Как лучше синхронизовать данные между клиентом и сервером?

Рейтинг: 0Ответов: 1Опубликовано: 25.01.2023

Разрабатываю веб-игру используя node.js, javascript и websocket, имеется показатель жизней. По нажатию кнопки должна происходить регенерация, со скоростью 1 HP в 1 сек. Как лучше реализовать механизм регенерации? Варианты:

  1. Отправить запрос на сервер. Сервер запускает setInterval на 1000 мс. для каждого игрока, который начал регенерацию и каждый цикл отправляет клиенту новое состояние здоровья.
  2. Запустить на клиенте setInterval на 1000 мс. и отправить запрос на сервер. На сервере сохраняем время начала регенерации и запускаем setTmeout, который должен сработать через время, небходимое для полного восстановления (100 - [хп игрока]) - секунды для полного восстановления.

Может есть другие варианты? Не будет ли первый вариант слишком ресурсозатратным?

Ответы

▲ 0Принят

Для реализации данного способа необходимо логическое представление об отправке данных. Ведь постоянный спам - это не лучшее решение. Давайте окунёмся в мир логики и представим, что на вашем сервере играет 3 игрока.

  1. Игрок №1 (Обычный игрок, у которого доступна регенерация)
  2. Игрок №2 (Софтер, который уже нажимал кнопку, но будет спамить на сервер)
  3. Игрок №3 (Игрок в состоянии регенерации, но задержка скоро закончится)

Как же мы реализуем данную систему?

  1. Необходимо уже иметь готовый виртуальный таймер на стороне клиентов. Он будет обеспечивать визуальную регенерацию.
  2. При нажатии на кнопку регенерации необходимо проверить действительно ли указанный игрок имеет право на регенерацию на сервере и отправить запрос о начале регенерации игрока (точнее дату окончания регенерации и дату начала) всем игрокам, в том числе и инициатору. В результате мы будем высчитывать это всё на клиентской стороне, а сервер будет отдыхать.

Теперь самое интересное! Испытание теории:

  1. Игрок №1 нажимает на кнопку -> сервер (одобряет его действия) -> отправляет всем клиентам сообщение о запуске таймера над головой у Игрока №1.
  2. Игрок №2 отправляет фейковое-сообщение о регенерации через софт -> сервер (отказывает его действия)
  3. Игрок №3 закончил регенерацию. У всех игроков автоматически убрался таймер над головой, так как он установлен на стороне клиента и не нужно ничего обновлять.