C# MMO структура сервера

Я в начале написания простого сервера mmo для демонстрационной игры. Я использую протокол UDP (UdpClient), но мне интересно, как работают другие серверы?:

  1. только 1 UDP-клиент, который обрабатывает все подключенные клиенты и сообщения и отвечает на них
  2. сервер создает новый экземпляр клиента UDP для каждого подключенного игрока?

Я протестировал подключение 50 клиентов, которые отправляют сообщение "Ping", а сервер должен ответить "Pong". Отправка 50-го "Понга" занимает около 10 секунд (на локальном хосте) (в то же время сервер должен также отправлять пинг 1-му игроку, поэтому очередь может быть увеличена до нескольких часов, что абсурдно)

3 ответа

Решение

Другие серверы используют 1), т.е. слушают от любого клиента с одним сокетом (из которых я предполагаю, что есть один на UdpClient). Более того:

  • Этот сокет должен использоваться на протяжении всего срока службы сервера, т. Е. Не создавать новый при выполнении одной дейтаграммы.
  • Прием и отправка должны выполняться асинхронно, чтобы прием / отправка одного потока не задерживала прием / отправку другого потока.
  • Остерегайтесь объема данных, которые вы отправляете / получаете - если вы отправляете / получаете данные нескольким клиентам с сервера, общий объем данных умножается на количество клиентов.

Выполнение вышеуказанного на локальном хосте с 50 клиентами, отправляющими ping и получающими pong, который составляет всего несколько байтов, должно занимать менее 1 мс, при условии, что какой-то другой процесс не максимизирует процессоры.

Вы должны делать что-то не так. Я написал сервер, который обрабатывает 4 миллиона сообщений ping / pong в секунду с временем доставки 10-20 миллисекунд для каждого сообщения. Я использую протокол TCP.

Я рекомендую вам прочитать руководство Beej по программированию сокетов, переписать свой сетевой код клиент-сервер и посмотреть, получите ли вы лучшие номера: http://beej.us/guide/bgnet/

Я собираюсь уточнить свой ответ, сказав, что я не знаю внутреннюю структуру MMO-серверов. Я немного удивлен, что для 50 пинг-понгов требуется 10 секунд, я думаю, особенно на локальном хосте, что это будет намного быстрее. Я подозреваю, что у вас есть какая-то проблема или, возможно, ваши клиенты особенно сложны для инициализации. Я предлагаю вам скачать что-то вроде Wireshark ( http://www.wireshark.org/) и посмотреть на свой IP-трафик, чтобы увидеть, что на самом деле происходит.

Если вы играете в MMO, вы также можете использовать wireshark, чтобы посмотреть на передаваемые пакеты и получить лучшее представление о том, что делают их серверы.

Другие вопросы по тегам