Синхронизировать действия на сервере и клиенте

Всем привет. Я делаю что-то типа небольшой игры, она достаточно динамическая, хоть и минималистичная. Я принимаю события от клиентов, потом двигаю все на сервере и рассылаю на клиенты как оно теперь все выглядит. Получается нормально, но в игре есть еще и механика выстрелов. И вот все это нормально работает, но потребляет очень много ресурсов сети. Я вынужден как-то экономить это. Я придумал такую штуку: персонажей я буду двигать как и раньше на сервере, но полет пуль я не буду каждый раз синхронизировать с сервером. Я просто один раз отдам событие, что кто-то выстрелил. А дальше каждый клиент пусть сам себе отрисовывает свои пульки, но считает попадание пулек пусть сервер. И это тоже здорово работает в плане экономии ресурсов. Но вот беда, пульки очень по разному летят на сервере и на клиенте. Дело в том, что я попытался синхронизировать всё через временную метку, на клиенте это Date.now() и на сервере тоже, я на ноде пишу. Так вот, а временные метки сильно отличаются, на пару секунд даже. Это не из-за задержки, разница прям очевидная. Это как так и почему? Есть ли какой-то таймер, которые даст точно время с точностью до секунды? Ну или может я бред делаю, есть идеи получше?


Ответы (1 шт):

Автор решения: IIITS TIIIMEEE

Кажется, я кое-что придумал.
А что если сначала определить задержку - за сколько сообщение доходит от клиента к серверу. Потом получить временную метку на клиенте и отправить сообщение на сервер, получить там временную метку и отправить ее на клиент. Потом на клиенте скорректировать временную метку сервера с учетом времени, которое сообщение шло до сервера и потом определить разницу временных меток сервера и клиента.

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

Ну, вроде бы, это должно работать.

→ Ссылка