Я работаю над 2D-шутером сверху вниз и стараюсь копировать концепции, используемые в сетевых играх, таких как Quake 3.
- У меня есть авторитетный сервер.
- Сервер отправляет снимки клиентам.
- Снимки содержат метку времени и позиции объекта.
- Объекты интерполируются между положениями снимка, поэтому движение выглядит плавным.
- По необходимости, интерполяция сущностей происходит немного «в прошлом», поэтому у нас есть несколько снимков, между которыми можно интерполировать.
Проблема, с которой я сталкиваюсь, это «синхронизация часов».
- Для простоты давайте на мгновение представим, что при передаче пакетов на сервер и с него существует нулевая задержка.
- Если часы сервера на 60 секунд опережают часы клиента, то метка времени снимка будет на 60000 мс впереди локальной метки времени клиента.
- Следовательно, моментальные снимки сущности будут собираться и храниться в течение примерно 60 секунд, прежде чем клиент увидит, что какой-то конкретный объект делает свои ходы, потому что это занимает много времени, чтобы часы клиента успели догнать.
Мне удалось преодолеть это путем вычисления разницы между часами сервера и клиента при каждом получении снимка.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
При определении того, как далеко находится объект интерполяции, я просто добавляю разницу к текущему времени клиента. Проблема с этим, однако, заключается в том, что это вызовет дрожание, потому что разница между двумя часами будет резко колебаться из-за того, что моментальные снимки поступают быстрее / медленнее, чем другие.
Как я могу синхронизировать часы достаточно близко, чтобы единственной ощутимой задержкой была та, которая жестко запрограммирована для интерполяции, и та, которая вызвана обычной задержкой в сети?
Другими словами, как я могу предотвратить слишком позднюю или слишком раннюю интерполяцию, когда часы значительно десинхронизированы, без появления рывков?
Редактировать: Согласно Википедии , NTP может использоваться для синхронизации часов через Интернет с точностью до нескольких миллисекунд. Тем не менее, протокол кажется сложным, и, возможно, излишним для использования в играх?