C# MMO структура сервера
Я в начале написания простого сервера mmo для демонстрационной игры. Я использую протокол UDP (UdpClient), но мне интересно, как работают другие серверы?:
- только 1 UDP-клиент, который обрабатывает все подключенные клиенты и сообщения и отвечает на них
- сервер создает новый экземпляр клиента 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, чтобы посмотреть на передаваемые пакеты и получить лучшее представление о том, что делают их серверы.