Я планирую создать сервер Java, который будет обрабатывать общение в режиме реального времени между клиентами. Каков наилучший тип реализации Java, который может эффективно и, надеюсь, точно общаться между клиентом и сервером на высоких скоростях (скажем, 5-15 пакетов в секунду)? Я знаю, что существует много типов API-интерфейсов Java (то есть ObjectInputStream и ObjectOutputStream, DatagramPacket, KyroNet и т.д.), Но я не уверен, что является наиболее эффективной и/или часто используемой реализацией для такого сценария. Я бы предположил, что большинство игр реального времени используют методы связи UDP, но я понимаю проблемы надежности, которые приходят с ним. Существуют ли реализации UDP, которые имеют определенную форму управления потоком? В любом случае, спасибо заранее!
Какова самая эффективная реализация Java для игрового сервера в режиме реального времени?
Ответ 1
Несколько вещей, которые следует учитывать:
- Java NIO действительно хорош и может обрабатывать вид пропускной способности/латентности, который вы ищете. Не используйте какие-либо старые структуры/API-интерфейсы для сетей и сериализации.
- Задержка действительно важна. Вы в основном хотите минимальный уровень над NIO, который позволяет отправлять очень быстрые, небольшие, индивидуальные сообщения с минимальными издержками.
- В зависимости от игры вам может потребоваться TCP или UDP или оба. Используйте TCP для важных сообщений, UDP для сообщений, которые не являются строго необходимыми для продолжения игры или будут включены в будущие обновления (например, обновления местоположения в FPS).
- Некоторые люди реализуют собственный TCP-протокол обмена сообщениями через UDP для игр в реальном времени. Это, вероятно, больше хлопот, чем того стоит, но имейте это в виду как вариант, если вам действительно нужно оптимизировать для определенного типа связи.
- Для игр в реальном времени вы почти всегда выполняете настраиваемую сериализацию (например, отправляете только дельта, а не полные обновления позиций объекта), поэтому убедитесь, что ваша инфраструктура позволяет это
Учитывая это, я бы рекомендовал один из следующих
- Kryonet - lightwieght, настраиваемый, предназначенный для такого рода целей
- Netty - чуть более ориентированный на предприятия, но очень способный, надежный и масштабируемый
- Roll-your-own на основе NIO - сложно, но возможно, если вы хотите действительно мелкозернистый контроль. Я делал это раньше, но в ретроспективе я, вероятно, должен был выбрать Kryonet или Netty
Удачи!
Ответ 2
Непосредственно забывайте ObjectOutputStream и ObjectInputStream. Это стандартные механизмы ввода-вывода старой стандартной сериализации Java, которая медленна и создает объекты раздувания. Некоторые ресурсы для начала: