Прежде всего, я хотел бы извиниться за мой плохой английский :) Вчера я закончил писать свою первую многопользовательскую игру (понг) на C++ с помощью Winsock и Allegro5. Игра состоит из одного сервера для всех игроков и клиентов.Почему запаздывание противника в моей игре в многопользовательском понге?
Каждый клиент кадра (FPS = 60) отправляет свои координаты mouse_y на сервер, который передает их клиентам своих оппонентов соответственно. Когда я играю в игру на своих двух компьютерах, подключающихся к серверу, который работает на одном из них, по локальной сети он отлично работает, весло оппонента движется плавно. Но когда я делаю то же самое подключение через мой внешний IP-адрес, лопасть противника отстает, что разрушает игру, потому что это клиент, который проверяет, попал ли мяч в лопатку противника или нет. Таким образом, синхронизация разрушена, всякий раз, когда я перемещаю один весло, чтобы отскакивать мяч на другом компьютере, он отстает и не делает это вовремя, что приводит к забиванию точки для противника ... Но это не игра, которая отстает. Мои весла и мяч движутся плавно. Проблема только в веслах противника.
Я новичок в сетевом программировании, поскольку я только читал Beej's Guide to Network Programming. Я использую TCP-сокеты для отправки() и recv() координат весла и функции select() для опроса сокетов для данных.
У меня нет ни единой идеи, что может быть причиной.
TL; DR: Весы протектора отстают, когда я подключаюсь через внешний IP-адрес, но не при подключении через локальный IP-адрес.
Если я сменил TCP-сокеты на UDP, действительно ли это ускорит передачу данных до такой степени, что игра будет воспроизводиться? – user2648421
@ пользователь2648421 Да, * почти *. TCP не подходит для игр. Также руководство Beej не подходит для игр. Вы должны купить книгу, связанную с многопользовательскими играми, и использовать страницы руководства для таких функций, как sendto/recvfrom. –
@ user2648421 Руководство Beej смутит вас. Особенно в окнах, где 'select' - всего лишь плохая идея. –