MMORPG серверная Java-архитектура

8

В настоящее время я делаю MMORPG-игру, основанную на пошаговых играх. Клиент должен работать на Android. Теперь мой друг занимается графикой, а я занимаюсь игровыми классами (игрок, оружие и т. Д.). Теперь, если борьба начата, классами можно управлять с помощью интерфейсов (фактически для моего партнера это похоже на работу с чистыми интерфейсами, ему не нужен доступ к классам реализации).

Теперь нам нужно представить игровой сервер для нескольких игроков. И возникает несколько очень важных вопросов:

1) Должен ли я полностью скопировать игровую модель на сервер, не оставляя классов на клиенте, или лучше иметь 2 копии модели - 1 на сервере и 1 на устройстве и выполнять периодическую синхронизацию между ними?

2) Какой способ подключения выбрать между клиентом и сервером (клиент в поле зрения - телефон Android)? Что касается сервера - я обращаюсь к Java, потому что у меня есть некоторый опыт работы с ним. Но теперь возникает вопрос - лучше ли использовать сокеты для этой задачи, или я могу использовать службы REST, или даже возможно как-то подключить его к серверу Java EE, что, с моей точки зрения, здорово, потому что это убирает много программирования осложнение? Несмотря на то, что игра многопользовательская, она пошаговая, поэтому обновлять ее не нужно очень часто.

3) Как насчет потоков? Должен ли каждый клиент иметь свой собственный поток (в случае сокетов)?

4) Существуют ли какие-либо книги по программированию серверных игр REAL MMORPG ???

Артем Москалев
источник

Ответы:

7

Не копируйте всю игровую модель на сервер, вы не хотели бы загружать все текстуры и подробные сетки на ваш сервер. Сохраняйте это как можно более простым, обрабатывайте все важные процессы, такие как местоположение, здоровье, любое движение, но не загружайте все. - НИКОГДА НЕ ДОВЕРЯЙТЕ КЛИЕНТУ.

Есть много книг, а также несколько вики. Каждый поставщик движков, например, IdeaFrabrik, Epic Games, Exitgames, Unity (также поддерживает mmo's), имеет очень хорошую документацию для своих продуктов. Большая часть этой информации является общедоступной, поэтому вы получили доступ к готовым решениям и можете узнать, как все работает.

Самый простой способ найти нужную книгу - это поискать в MMORPG на Amazon, затем перейти в категорию книг и выбрать подкатегорию «Программирование». Если вы гуглите его, вы получите нежелательные результаты ...

Вот список книг, которые я нашел

Я не углубился в программирование сервера, но на самом деле я был близок к выбору решения Unity + Photon Cloud для своего проекта MMORPG. (HeroEngine победил) На этом этапе серверная часть делается на C #, и одну вещь, которую я сильно помню, это то, как вещи объяснялись в уроках.

Миколай Марциш
источник
Мы не используем какой-либо движок, потому что игра не требует его. Ему не хватает классной графики. Таким образом, нам не нужен Unity с его высочайшими возможностями для 3D. Представленные вами книги кажутся слишком широкими, но в них нет ссылок на книгу, объясняющую, как написать многопользовательский сервер с высокой нагрузкой. Но спасибо за совет.
Артем Москалев
Вы должны узнать о программировании TCP-сервер-клиент. «Проще говоря, серверное программирование также используется в играх». Вы должны изучить его основы. Это может помочь вам начать это на Java. edn.embarcadero.com/article/31995
Миколай Марциш
Да, я знаю, что уже =) Я запрограммировал достаточно тех, что в сочетании с JMS и простыми серверами строковых сообщений =) Поэтому я спросил, что лучше + сокеты довольно низкого уровня по сравнению с Java EE, с которым я работал ранее) Я просто не знаю, как это делается с многопользовательскими играми, потому что до сих пор кажется, что программирование игрового сервера полностью отличается от программирования веб-сайтов или простых программ обмена сообщениями)
Артем Москалев
4

1) Должен ли я полностью скопировать игровую модель на сервер, не оставляя классов на клиенте, или лучше иметь 2 копии модели - 1 на сервере и 1 на устройстве и выполнять периодическую синхронизацию между ними?

Договорились с Николаем, не копируйте все. Отправьте как можно меньше данных. Вы можете иметь одинаковые классы (представляющие только модель данных, а не другие активы) на клиенте и сервере, но не отправлять их по сети. Вы хотите сериализовать их на сервере и десериализовать на клиенте. Клиент должен отправлять только команды на сервер.

2) Какой способ подключения выбрать между клиентом и сервером (клиент в поле зрения - телефон Android)? Что касается сервера - я обращаюсь к Java, потому что у меня есть некоторый опыт работы с ним. Но теперь возникает вопрос - лучше ли использовать сокеты для этой задачи, или я могу использовать службы REST, или даже возможно как-то подключить его к серверу Java EE, что, на мой взгляд, здорово, потому что это убирает много программирования осложнение? Несмотря на то, что игра многопользовательская, она пошаговая, поэтому обновлять ее не нужно очень часто.

Вы планируете пошаговую MMORPG (пока не знаю, как это будет работать). Так что скорость не является большой проблемой. Вы можете использовать любой вид услуг, REST может быть хорошим, это просто. Обычно MMORPG используют UDP (небезопасный, меньший, более быстрый) для таких вещей, как обновления движения, когда потерянный пакет или два не имеет значения, и TCP (безопасный, накладные расходы) для безопасной связи. В большинстве игр, вероятно, используется какой-то зашифрованный, сжатый пользовательский протокол по UDP и TCP, чтобы сделать его быстрым и трудным для взлома.

3) Как насчет потоков? Должен ли каждый клиент иметь свой собственный поток (в случае сокетов)?

Обычно вы хотите иметь пул потоков. Каждый поток из пула обслуживает один запрос, а затем перерабатывается. Если у вас недостаточно потоков, вы можете рассмотреть возможность блокировки или выделения большего количества потоков.

4) Существуют ли какие-либо книги по программированию серверных игр REAL MMORPG ???

Николай уже гуглил это для тебя ...

MartinTeeVarga
источник
Не могли бы вы подробнее рассказать о пуле потоков? Если есть сокеты, то сервер прослушивает запросы и выделяет новый сокет для каждого. Эти сокеты со всей входящей информацией могут быть инкапсулированы как работа в поток. Но как потоки извлекаются из пула потоков, если каждый раз эти потоки выполняют разные задания? + сколько открытых сокетов может вместить средний сервер? Это будет более ресурсоемким, чем REST или нет? + в REST нет состояния сеанса, поэтому сложно поддерживать информацию об игроке. Но отдых в Java имеет прекрасную интеграцию с корпоративным сервером, что хорошо
Артем Москалев
Представленные книги посвящены ООП-дизайну MMORPG, как видно из комментариев. Для этого я бы предпочел придерживаться GoF. Опять же, похоже, что программирование многопользовательских онлайн-игр на стороне сервера - это своего рода священное знание, переданное через поколение =) Все форумы / публикации / книги приходят к таким идеям: «Не пытайтесь программировать MMO / Программирование MMO действительно сложно / MMO не для новичок "... и никаких советов вообще ...
Артем Москалев
1
Посмотрите на этот пример: tutorials.jenkov.com/java-multithreaded-servers/…
MartinTeeVarga
Представленные книги посвящены ООП-дизайну MMORPG, как видно из комментариев. Для этого я бы предпочел придерживаться GoF. Это предложение не имеет смысла. Также создание MMORPG эквивалентно созданию реактивного самолета. Я бы сказал, подними крылья на бумажных самолетах.
MartinTeeVarga
Вы на 100% правы относительно бумажных плоскостей =) Но эти книги даже не о бумажных плоскостях (под бумажными плоскостями я имею в виду программирование на стороне сервера mmo) - я уже узнал об этом из комментариев на amazon =) Некоторые из этих книг имеют дело с шаблоны проектирования для игр MMORPG, которые можно изучить из других, более качественных книг, в том же контексте создания игр. + Я уже строю B-2, поэтому я ценю любой совет, который могу получить. Спасибо =)
Артем Москалев