Хоча сервер має остаточне слово щодо позиції, він повинен зробити це, перевіривши та перевіривши, чи правильно перевіряє те, що клієнт надсилає як дані та позиції. Я говорю це тому, що те, що ти робиш, - це переміщення гравця негайно, і очікування, яке створюється у вашому коді, - це те, що клієнт - це реальна позиція.
Ви думаєте, що це взагалі добре працює, але це не так. Побічна примітка: ви кажете, що ваш клієнт - це не що інше, як рендерінг, а потім негайно дайте йому місцевий контроль, щоб він рухався без повідомлень сервера. У вас це не може бути обома способами, або зачекайте, поки сервер підкаже вам рухатися, або візьміть на себе деякий контроль над своєю позицією та використовуйте сервер для перевірки читів.
Зауважу, що ваші відповіді сягають однієї цілої секунди? Це затримка в 500 мс, яка смішно велика для будь-яких ігрових дій. Спробуйте з’ясувати, чому цей поворот займає так довго, це може бути що завгодно, від резервних команд, резервного копіювання від того, щоб не отримувати негайно обробку до затопленої пропускної здатності або навіть демонів, викликаючи багато втрачених пакетів.
Я думаю, що це має статися, це те
client sends a move + position update
server gets it t+latency time later
server verifies and sends out info to all clients
client receives this at (t+latency + latency)
Тут складна частина полягає в тому, що якщо клієнт отримує повідомлення про себе, він здебільшого повинен ігнорувати його, якщо це повідомлення є чимось на зразок "недійсний хід, замість цього перейдіть до XYZ". Якщо це повідомлення для кого-небудь іншого клієнта, що ви отримуєте інформацію про нього, тоді вам доведеться вчасно екстраполювати вперед, так що, схоже, буде там, де воно буде.