SvetlyiAkaPro
@SvetlyiAkaPro

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

Я так понял, что лучшая архитектура для игры та, в которой сервер главный, двигает игроков, пули и все считает. Но что, если элементов игры много, каждый надо подвинуть, что-то посчитать в зависимости от их положения друг относительно друга? Например есть что-то такое на сервере:
setTimeout(function() {
//все просчитываем, двигаем, посылаем
}, 30);

Можно как-то улучшить, оптимизировать это? Например что-то считать и двигать на клиенте и посылать на сервер только при создании каких-то элеметов, тех же пуль например, но чтобы при этом все было синхронно на клиентах и сервере, чтобы не было, ситуаций, когда на сервере что-то уже случилось, взорвалось, а на клиенте пули, гранаты, какие-то элементы еще даже не долетели.

Уточню
На каждого игрока имеется в среднем по 20 пуль, которые летят по прямой и их координаты надо просчитывать, для чего и setTimeout, который каждый момент времени двигает в направлении их движения(и считает координаты игроков). Собственно и проблема в рассинхронизации координат, т.к. на данном этапе считаются координаты и на сервере и на клиенте, но они не обмениваются, синхронизируется только счет при попадании по противнику.
Хотелось бы синхронизировать координаты, вижу такие варианты:
  • Посылать пули кучей вместе с координатами игроков
  • Сохранить текущую архитектуру и синхронизировать координаты пуль каждые 60мск допустим
  • Посчитать задержку между сервером и клиентом и добавить разницу к фпс в setTimeout
  • Вопрос задан
  • 3390 просмотров
Решения вопроса 1
Lerg
@Lerg
Defold, Corona, Lua, GameDev
30 fps на сервере избыточно. В зависимости от игры можно значительно снизить частоту обсчёта до 5..15 раз в секунду.
Клиент обсчитывает всё в 30 или 60 fps, сверяя данные с серверными. Если клиент ничего не будет сам обсчитывать, то будут видны жуткие лаги.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
begemot_sun
@begemot_sun
Программист в душе.
Полная картина мира есть только у сервера. У каждого клиента есть только локальная картина мира, которая необходима ему именно в этот момент и больше никогда. Перенос логики обсчета с сервера на клиент приносит дополнительные трудности:
1. Читерство (как доверять результатам полученным от клиента ?)
2. Синхронизация. Каждый клиент это всего лишь инструмент отображения игровой обстановки, но как быть с тем что результаты обсчета от одного клиента должны быть распространены на остальные клиенты ?
3. Может что то еще ???

Короче так никогда не делают.
Ответ написан
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
на сервере надо просчитывать то, от чего зависит логика игры, что бы пользовали не могли чего подправить на клиенте. Обсчет каких-то вещей связанных с отображением этого - конечно на клиенте.

Ну а думать над оптимизациями не зная всей картины довольно сложно. И опять же не понятно причем тут setTimeout

Обмен данными лучше повесить на WebSockets а еще лучше на WebRTC (там есть поддержка UDP для обмена данными).
Ответ написан
@Elizavetta
Matroid: gamedev/js-разработка
Ага, не хватает prediction на клиенте.
Почитать про синхронизацию можно здесь forrestthewoods.com/synchronous-rts-engines-and-a-...
И поискать здесь 0fps.net

А вы HTML5 делаете?
Ответ написан
SvetlyiAkaPro
@SvetlyiAkaPro Автор вопроса
Окей, поясню, под расчитыванием на клиенте я имел в виду дублирование расчетов и на сервере. Расчет на клиенте для того, чтобы лишний раз не гонять данные. Ну и результаты игры естественно считается на сервере, поэтому читеров тут быть не может :) Но тут появляются проблемы с рассинхронизацией
WebSockets используются, setTimeout для передвижений элементов, они не зависят от каких-то событий, просто какие-то элементы идут, плывут, летят, передвигаются все время на определенное расстояние и это надо отразить на клиенте
В setTimeout(....., 30); 30 просто для примера, показать суть работы
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы