Jeśli jeszcze tego nie zrobiłeś, proponuję przeczytać dwa głębokie, ale zrozumiałe artykuły: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking i http://fabiensanglard.net/quake3/network.php .
Wyjaśniają one, dlaczego zaleca się wysyłanie pakietów w ustalonych odstępach czasu. Krótko mówiąc, jest to szczególnie ważne w przypadku pakietów wysyłanych przez serwer.
Wysłanie pakietu ma stały koszt, a maksymalny rozmiar pakietu sieciowego wynosi około 1,5 KB. Jeśli więc masz na przykład 16 graczy na serwerze, każda klatka podczas obliczania ruchu dla gracza, naiwny kod może wysłać pakiet aktualizacji do każdego gracza po każdej rozdzielczości ruchu, więc 16 * 16 = 256 pakietów. Jeśli masz 30 klatek na sekundę, to 7680 pakietów.
Lepszym podejściem jest utworzenie bufora na każdym początku ramki, połączenie w nim aktualizacji 16 obliczonych pozycji, a następnie wysłanie ich do 16 graczy.
Teraz wysyłasz tylko 480 pakietów na sekundę dla tych samych wyników.
W przypadku odtwarzacza z serwerem oznacza to po prostu, że w tym samym pakiecie należy przesłać maksymalnie dane, takie jak; wyglądała pozycja, działania nazywane tą ramką i tak dalej.
O drugiej części twojego pytania - sposobem, w jaki zdecydowałem się zmniejszyć odczucie opóźnienia, było wysłanie tych informacji do serwera w każdej ramce:
aktualna bieżąca pozycja gracza (używana przez serwer do sprawdzenia, czy pozycje po stronie serwera i po stronie gracza nie są zbytnio zsynchronizowane).
Szacowana pozycja gracza w ciągu 1 sekundy: obliczona przez klienta: jeśli gracz nie zmieni kierunku myszy i pozostawi klawiaturę w obecnym stanie na 1 sekundę, gdzie będzie gracz? (nie dbamy o kolizje) Jeśli gracz się nie porusza, jego szacunkowa pozycja w ciągu 1 sekundy jest jego aktualną pozycją.
Pozycja, na którą patrzy.
Za każdym razem, gdy serwer otrzymuje te informacje, aktualizuje przyszłą pozycję i wyglądaną pozycję, a podmiot gracza ostatecznie przesuwa się w kierunku swojej przyszłej pozycji.
Gracze nigdy nie są dokładnie zsynchronizowani, ale odpowiedź wejściowa jest natychmiastowa (najważniejsze dla mnie) i stwierdziłem, że przewidywane pozycje są dla mnie wystarczająco dokładne.