@sema-fedotov

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

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

Может есть другие варианты? Не будет ли первый вариант слишком ресурсозатратным?
  • Вопрос задан
  • 80 просмотров
Пригласить эксперта
Ответы на вопрос 1
@rPman
Все зависит от того, как у тебя состояние обрабатывается на клиенте, чем клиент является.
В нормальной ситуации все таймауты и всю логику обязан делать сервер, это логичное следствие защиты этого состояния от мошенничества со стороны клиентов. Клиенты же только принимают изменения этого состояния и отображают пользователю.

Иногда, чтобы убрать визуальные лаги, параллельно серверу состояние игрового мира (или его часть) удерживается на клиенте и обрабатывается одновременно, по возможности синхронно (только нужно помнить что реальное состояние на сервере и на клиенте отстают по времени).

Поэтому ответ:
- по первой схеме сервер отправляет клиентам с периодичностью информацию об итоговом изменении уровня жизней.
- по второй схеме сервер отправляет клиентам команду "начинайте увеличивать жизнь со скоростью X до уровня Y" и клиенты это выполняют, запустив свой таймер.
Для контроля состояний сервер может периодически высылать хеш своего состояния чтобы клиенты могли его сравнить со своим, если они различаются значит в коде баг (например неверно обрабатывается лаги) и как минимум нужна повторная загрузка состояния с сервера
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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