Я працюю над 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 може використовуватися для синхронізації годин через Інтернет протягом декількох мілісекунд. Однак протокол здається складним і, можливо, надмірним для використання в іграх?