Якщо ви ще цього не зробили, пропоную прочитати ці дві глибокі, але зрозумілі статті: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking та http://fabiensanglard.net/quake3/network.php .
Вони пояснюють, чому рекомендується використовувати "фіксований інтервал" надсилання пакетів. Коротше кажучи, це насправді важливо для пакетів, що надсилаються сервером.
Відправлення пакету має фіксовану вартість, а максимальний розмір мережевого пакету - близько 1,5 Кб. Отже, якщо у вас на сервері є, наприклад, 16 гравців, кожен кадр, коли ви обчислюєте рух для гравця, наївний код може надсилати пакет оновлень кожному гравцеві після кожного дозволу руху, тому 16 * 16 = 256 пакетів. Якщо у вас частота кадрів 30, це 7680 пакетів.
Кращий підхід - створити буфер в кожному початку кадру, об'єднати в нього оновлені 16 обчислених позицій, а потім надіслати їх своїм 16 гравцям.
Тепер ви надсилаєте лише 480 пакетів за секунди для однакових результатів.
У випадку "гравець-сервер" це означає, що ви повинні надсилати в одному пакеті максимум даних, наприклад; виглядала позиція, дії називали цей кадр тощо.
Щодо другої частини вашого запитання - я вибрав спосіб зменшити відставання, щоб передати цю інформацію серверу на кожен кадр:
фактична поточна позиція гравця (використовується сервером для перевірки того, чи є позиції на стороні сервера та стороні гравця не надто синхронізовані).
Орієнтовна позиція гравця за 1 секунду: обчислюється клієнтом: якщо гравець не змінить напрям миші і не залишить клавіатуру в поточному стані протягом 1 секунди, де буде гравець? (нас не хвилює зіткнення) Якщо гравець не рухається, то його орієнтовна позиція за 1 секунду - це його поточне положення.
Позиція, на яку він дивиться.
Кожен раз, коли сервер отримує цю інформацію, він оновлює майбутню позицію та позицію, і об'єкт гравця з часом рухається до своєї майбутньої позиції.
Гравці ніколи точно не синхронізовані, але відповідь на вхід миттєва (для мене найважливіше), і я знайшов прогнозовані позиції для мене досить точними.