KryoNet sendToAllTCP против sendTCP

Я думаю о создании сетевой игры.
Игра должна быть двухмерным платформенным шутером, созданным с помощью Libgdx и Box2D.
Для сетевой игры я планировал следующую структуру:

  • Сервер и клиент это 2 программы
  • Сервер обрабатывает ВСЮ игровую логику
  • Клиент отправляет ввод с клавиатуры/мыши
  • Сервер реагирует на это и обновляет весь уровень
  • Сервер отправляет эти обновления (по возможности 45 раз в секунду, поэтому интерполяция на стороне клиента не требуется)
  • Клиент получает обновления и обновляет свой локальный уровень/мир, используя полученные обновления.
  • Клиент рисует вещи в своем view frustum

Первый вопрос: что вы думаете об этой структуре?
Следующий вопрос: 45 раз в секунду может быть много загрузки данных с сервера, если есть несколько игроков, которые стреляют много пуль (нужны позиции игроков и пуль). для отправки).
Чтобы ограничить необходимую загрузку, я подумал об использовании view frustum culling и отправке только тех данных/обновлений, которые клиент действительно увидит.
Теперь я увидел метод KryoNet sendToAllTCP и задался вопросом, является ли этот метод каким-то образом более эффективен и может каким-то образом загружать данные только один раз, а не один раз для каждого клиента.
У меня нет опыта работы с сетями, и я действительно не думаю, что можно иметь 1 загрузку для более чем одного клиента. Но, чтобы быть уверенным, я спрашиваю.
Так эффективнее отправлять каждое обновление уровня с sendToAllTCP или эффективнее отправлять один раз для каждого клиента, а затем только то, что они могут видеть?


person Springrbua    schedule 09.05.2014    source источник


Ответы (1)


KryoNet имеет открытый исходный код, и вы можете увидеть, что он делает здесь: https://github.com/EsotericSoftware/kryonet< /а>

Метод sendToAllTCP находится здесь: https://github.com/EsotericSoftware/kryonet/blob/master/src/com/esotericsoftware/kryonet/Server.java#L447

Метод sendToAllTCP просто перебирает TCP-соединения и отправляет одинаковые данные каждому из них. В источнике есть комментарий о том, что они должны сериализовать данные только один раз и отправлять сериализованный объект несколько раз, но пока этого не делают.

Как правило, возможность отправлять данные на несколько хостов за одну отправку называется «многоадресной рассылкой». По многим причинам он не является общедоступным и полезен только в узкоспециализированных ситуациях. См. http://www.tcpipguide.com/free/t_IPMulticasting.htm.

Проблемы с производительностью, с которыми вы столкнетесь, скорее связаны с задержкой в ​​Интернете, чем с необработанной способностью сервера отправлять пакеты. Я бы пока не слишком беспокоился об оптимизации отправки TCP-соединений.

person P.T.    schedule 10.05.2014
comment
Спасибо за информацию. Я думал, что вопрос о том, чтобы иметь одну загрузку для более чем одного клиента, - глупый вопрос, но похоже, что это действительно существует ^^ Интересно знать. Что касается проблемы с задержкой: я не думаю, что моя игра, если я вообще смогу ее запустить, будет работать в сети. Я больше думаю о Lan, где проблем с задержкой не так много. Большое спасибо! - person Springrbua; 12.05.2014