Какая реализация Java наиболее эффективна для игрового сервера реального времени? - PullRequest
10 голосов
/ 10 мая 2011

Я планирую создать сервер Java, который будет обрабатывать игровые коммуникации в реальном времени между клиентами. Каков наилучший тип реализации Java, который мог бы эффективно и, надеюсь, точно связываться между клиентом и сервером на высоких скоростях (скажем, 5-15 пакетов в секунду)? Я знаю, что существует много типов сетевых API-интерфейсов Java (т. Е. ObjectInputStream и ObjectOutputStream, DatagramPacket, KyroNet и т. Д.), Но я не уверен, что является наиболее эффективной и / или обычно используемой реализацией для такого сценария. Я бы предположил, что в большинстве игр в реальном времени используются методы связи UDP, но я понимаю проблемы с надежностью, которые с этим связаны. Существуют ли реализации UDP, которые имеют некоторую форму управления потоком? В любом случае, спасибо заранее!

Ответы [ 2 ]

12 голосов
/ 10 мая 2011

Несколько вещей для рассмотрения:

  • Java NIO действительно хорош и может справиться с требуемой пропускной способностью / задержкой. Не используйте какие-либо старые сетевые / сериализационные инфраструктуры и API
  • Задержка действительно важна. По сути, вам нужен минимальный уровень поверх NIO, который позволяет отправлять очень быстрые, небольшие отдельные сообщения с минимальными издержками.
  • В зависимости от игры вы можете выбрать TCP или UDP или оба . Используйте TCP для важных сообщений, UDP для сообщений, которые не являются строго необходимыми для продолжения игры или будут включены в последующее обновление (например, обновление позиции в FPS)
  • Некоторые люди реализуют свой собственный TCP-подобный протокол обмена сообщениями через UDP для игр в реальном времени. Это, вероятно, более хлопотно, чем стоит, но знайте, что это вариант, если вам действительно нужно оптимизировать для определенного типа связи
  • Для игр в реальном времени вы почти всегда выполняете пользовательскую сериализацию (например, только отправку дельт, а не полное обновление позиций объектов) - так что убедитесь, что ваша инфраструктура позволяет это

Учитывая это, я бы рекомендовал один из следующих

  • Kryonet - легкий, настраиваемый, предназначен для такого рода целей
  • Netty - чуть более ориентированная на предприятие, но очень способная, надежная и масштабируемая
  • Roll-your-own на основе NIO - сложно, но возможно, если вы хотите действительно точный контроль. Я делал это раньше, но в ретроспективе мне, наверное, следовало выбрать Kryonet или Netty

Удачи!

1 голос
/ 23 июля 2013

Незамедлительно забудьте ObjectOutputStream и ObjectInputStream.Это стандартные механизмы ввода-вывода старой стандартной сериализации Java, которая работает медленно и создает объекты-раздувания.Некоторые ресурсы для начала:

...