Pracuję nad strzelanką 2D z góry i staram się kopiować koncepcje stosowane w grach sieciowych, takich jak Quake 3.
- Mam autorytatywny serwer.
- Serwer wysyła migawki do klientów.
- Migawki zawierają znacznik czasu i pozycje encji.
- Elementy są interpolowane między pozycjami migawek, dzięki czemu ruch wygląda płynnie.
- Z konieczności interpolacja bytu zachodzi nieco „w przeszłości”, dzięki czemu mamy wiele migawek, w których można interpolować.
Problem, przed którym stoję, to „synchronizacja zegara”.
- Dla uproszczenia, po prostu udawajmy przez chwilę, że nie ma żadnych opóźnień podczas przesyłania pakietów do i z serwera.
- Jeśli zegar serwera jest 60 sekund przed zegarem klienta, znacznik czasu migawki będzie 60000 ms przed lokalnym znacznikiem czasu klienta.
- Dlatego migawki jednostek będą zbierać się i siedzieć przez około 60 sekund, zanim klient zobaczy, że dana istota wykonuje swoje ruchy, ponieważ tak długo trwa, zanim zegar klienta dogoni.
Udało mi się temu zaradzić, obliczając różnicę między zegarem serwera i klienta za każdym razem, gdy otrzymywana jest migawka.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Określając, jak daleko od interpolacji jest jednostka, po prostu dodaję różnicę do bieżącego czasu klienta. Problem polega jednak na tym, że spowoduje to szarpnięcie, ponieważ różnica między dwoma zegarami gwałtownie się zmienia z powodu migawek przybywających szybciej / wolniej niż inne.
Jak mogę zsynchronizować zegary wystarczająco dokładnie, aby jedynym zauważalnym opóźnieniem było to, które jest zakodowane na sztywno do interpolacji i które jest spowodowane zwykłym opóźnieniem sieci?
Innymi słowy, w jaki sposób mogę zapobiec zbyt późnemu lub zbyt wczesnemu uruchomieniu interpolacji, gdy zegary ulegną znacznej desynchronizacji, bez powodowania szarpnięć?
Edycja: Według Wikipedii NTP można wykorzystać do synchronizacji zegarów przez Internet w ciągu kilku milisekund. Jednak protokół wydaje się skomplikowany, a może przesada w użyciu w grach?