2012-02-21 2 views
3

Я пытаюсь написать небольшую онлайн-игру на основе плитки. Я установил соединение игровой сервер с сокетами, поэтому я могу легко отправлять строки с клиента на сервер и наоборот.Java MMO передача данных игры

Что я не понимаю, в какой форме я должен хранить данные, чтобы их можно было эффективно передавать? Должен ли я использовать объект данных, сериализовать и отправить его? Должен ли я хранить данные в одной длинной строке? Или есть другой способ?

Если это имеет значение, какие данные я буду посылать, это будет информация о других игроках, объектах карты и т.д.

Я просматривал в течение нескольких дней в настоящее время, и до сих пор никаких результатов (вероятно, это потому, что я не уверен, как эта проблема называется).

Спасибо!

ответ

4

Самое главное здесь: это пошаговая игра?

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

Для игр в реальном времени важно, чтобы вы пытались обновить состояние как можно чаще. Не важно, если пакет потерян; возможно, еще один пакет все еще находится в пути, который отменяет предыдущий пакет. Вот почему вы должны использовать сокеты UDP вместо TCP.

Учитывая, что вы говорите о играх на основе плитки, подумайте о том, какую информацию вам нужно сообщить вашим клиентам. Может быть, только игроки двигаются, а остальное статично?

Это сложная проблема, которая не позволяет дать однозначный ответ. Существует множество проектных решений, которые необходимо учитывать, касаясь дизайна основного цикла моделирования игры, обмана, тестирования сетевой архитектуры и т. Д. См. https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking для небольшого примера проблем, с которыми вы сталкиваетесь.

Самое простое решение, которое я могу дать вам:

  • Использование TCP сокеты, поэтому вам не придется обрабатывать потери пакетов.
  • Когда состояние игры изменяется на сервере, распространите состояние на всех клиентов. Сделайте это в чем-то, что не займет много места. Примером может быть передача небольших пакетов следующим образом: ENTITY NUMBER - NEW POSITION. (т. е. два 32-битных целых числа). Если вам необходимо сразу сообщить несколько обновлений, убедитесь, что они содержатся в одном и том же TCP-пакете и что буфер отправки TCP сразу же очищается с обоих концов.
  • Забудьте о всех проблемах с синхронизацией, с которыми вы столкнетесь при обращении к клиентам с обратным временем (ping) 400ms и за его пределами. При необходимости вы можете преобразовать пакет следующим образом: ENTITY NUMBER - NEW POSITION - CURRENT SPEED VECTOR, который позволит клиенту оценить позицию объекта, включая задержку задержки.
0

Это зависит от вас. Вы можете использовать String, сериализовать или упаковать данные в ByteBuffer и отправить его по сети. Выберите способ, который вам больше всего подходит. Но я полагаю, что ByteBuffer является наиболее эффективным для этого.

Я рекомендую библиотеку Netty, потому что она значительно упрощает обработку сокетов.

Смежные вопросы