В то время как сервер имеет последнее слово в позиции, он должен сделать это, проверяя и проверяя, что клиент отправляет в качестве входных данных и позиции. Я говорю это потому, что вы немедленно перемещаете игрока, и ожидание, которое создается в вашем коде, заключается в том, что клиент - это реальная позиция.
Вы думаете, что в целом это работает хорошо, но это не так. Примечание: вы говорите, что ваш клиент - не что иное, как средство визуализации, а затем быстро предоставляете ему локальный контроль для перемещения без сообщений сервера. У вас не может быть обоих способов: либо дождитесь, пока сервер скажет вам двигаться, либо возьмите на себя некоторый контроль над вашей позицией и используйте сервер для проверки читов.
Я отмечаю, что ваши ответы достигают целую секунду? Это задержка 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». Если это сообщение предназначено для чьего-либо клиента, о котором вы получаете информацию, вам придется вовремя экстраполировать форварды, чтобы оно выглядело примерно так, как оно будет.