Сокеты Java TCP, лучшие практики для уменьшения задержки

В настоящее время я создаю очень простую игру Pong на Java, которая должна работать по сети. Я основал дизайн сети на основе предыдущей клиентской задачи чата, которую я сделал ранее, которая состоит из сервера и клиента. Клиенты, подключенные к серверу, имеют отдельные потоки, ожидающие отправки информации на сервер (очевидно, что клиенты ограничены двумя в игре в понг)

Я спроектировал игру в понг так, что вся игровая логика рассчитывается на сервере, поскольку это такие простые вычисления, а данные сохраняются в объекте PongData, который состоит из 4 целых чисел и одной точки (2 целых числа для y-позиций игроков, 2 для счет и 1 очко за позиции шаров), затем они транслируются 2 клиентам через ObjectOutputStream, и все, что делают клиенты, это отображают их на экране. Всякий раз, когда они нажимают кнопку на клиенте, это передается через DataOutputStream на сервер.

Когда я запускаю игру локально с сервером и двумя клиентами, она работает отлично, но как только я запускаю один из клиентов на отдельном компьютере, она очень сильно тормозит, в основном делая игру неиграбельной. Я не уверен, как лучше всего разрабатывать такие игры, я просмотрел stackoverflow и Интернет, и отправка объектов через UDP кажется довольно сложной и, прежде всего, очень небезопасной, но я не уверен, как это лучше сделать через TCP не получая такого сильного лага.

Некоторая дополнительная информация, которую я могу дать, заключается в том, что поток игрового цикла выполняет все вычисления, передает информацию, а затем спит в течение 10 мс, прежде чем повторить ее снова, что дает игре хорошую скорость (по крайней мере, локально).


person ElliotEff    schedule 14.01.2016    source источник


Ответы (1)


Сбросьте свои потоки и вызовите Socket.setTcpNoDelay(true) при создании сокета.

person user207421    schedule 14.01.2016
comment
Использование settcpnodelay творило чудеса, теперь очень незначительное заикание, спасибо! - person ElliotEff; 14.01.2016