Сетевая библиотека для серверной части mmorpg (libuv/boost::asio?)

В настоящее время я переписываю серверную часть очень старой mmorpg и искал хорошую сетевую библиотеку с открытым исходным кодом для использования с C/C++.

Поскольку клиент уже существует, я не могу использовать какую-либо библиотеку, которая обеспечивает какую-то структуру пакетов или связь (как, например, RakNet).

Сервер будет использовать в основном UDP на трех разных портах.

После поиска в интернете я узнал о boost::asio и libuv.

boost::asio кажется зрелым вариантом, так как я уже буду использовать boost, но я читал, что их реализация UDP немного плоха, и что она не может достичь максимальной производительности многоядерного процессора из-за некоторых блокировок при использовании epoll.

libuv кажется отличным, управляется событиями, поддерживается большим проектом, но в настоящее время нет такого проекта, использующего его, поэтому я сомневаюсь в его использовании.

Что вы думаете? Могу ли я использовать libuv в подобном проекте или мне придется использовать boost::asio? Я открыт и для других предложений (они должны быть кроссплатформенными, и я уже отказался от enet, libevent и libev).


person RenatoUtsch    schedule 28.04.2013    source источник
comment
Для этого также может подойти liblacewing (поддерживает epoll, kqueue или IOCP в Windows). Раскрытие информации: я главный разработчик.   -  person James McLaughlin    schedule 29.04.2013
comment
Классный проект, посмотрю на него, но есть соблазн использовать asio, так как уже буду использовать boost.   -  person RenatoUtsch    schedule 30.04.2013
comment
@RenatoUtsch Привет, Ренато, а год спустя что ты выбрал? Не могли бы вы рассказать нам о вашем опыте? Спасибо   -  person Jean Davy    schedule 02.06.2014


Ответы (2)


Подойдет либо libuv, либо Boost.Asio. Я наблюдал аналогичные результаты между библиотеками как в приложениях реального времени, так и в приложениях, близких к реальному времени.

Если вы используете Boost.Asio, имейте в виду:

  • Как минимизировать объем памяти обработчика распределение.
  • io_service блокировку можно устранить, предоставив concurrency_hint значение 1 для io_service конструктор. Однако это не предотвратит блокировку внутри реактора.

Из моего опыта разработки игр:

  • Если сетевые возможности предоставляются игровому коду либо через интерфейс, либо через очередь, то довольно просто переключиться между одной библиотекой, основанной на событиях, и другой библиотекой, основанной на событиях, такой как Boost.Asio и libuv.
  • Архитектура сервера оказывает гораздо большее влияние, чем сам сетевой код. Как Boost.Asio, так и libuv предоставляют функции IPC, которые могут быть полезны для серверных архитектур с несколькими демонами.

Хотя между двумя библиотеками есть некоторое совпадение, возможно, стоит прочитать это сравнение.

person Tanner Sansbury    schedule 29.04.2013
comment
Но если я укажу concurrency_hint равным 1, то io_service будет работать только в одном потоке. Как тогда я могу воспользоваться преимуществами многопоточности? И спасибо за сравнение, очень помогло. - person RenatoUtsch; 29.04.2013
comment
Вы можете использовать несколько объектов io_service. Этот подход похож на libuv, так как libuv поддерживает несколько циклов событий, но не поддерживает выполнение одного и того же цикла из нескольких потоков. В Boost.Asio, если не установить concurrency_hint, несколько потоков могут безопасно обслуживать цикл обработки событий. - person Tanner Sansbury; 29.04.2013
comment
но не установка concurrency_hint вызовет проблемы с блокировкой реактора. Ну а дальше я буду запускать различные объекты io_service исходя из количества ядер процессора. Я читал, что реализация UDP в asio не очень хороша, это правда? Если это имеет значение, мне все-таки придется использовать libuv. Вы знаете что-нибудь об этом? - person RenatoUtsch; 29.04.2013
comment
Очень хорошо — субъективно, но UDP-сокеты Boost.Asio используют ту же службу, что и его TCP-сокеты, и мне еще предстоит столкнуться с тем, что служба сокетов станет узким местом. В более старых версиях были некоторые накладные расходы, особенно при регистрации событий в реакторе, но Boost.Asio претерпел различные оптимизации производительности на протяжении всей своей разработки. Хотя libuv, вероятно, будет быстрее, мой опыт разработки mmorpg показывает, что разница между Boost.Asio и libuv часто незначительна. Часто именно архитектура сервера в конечном итоге ограничивает максимальную производительность. - person Tanner Sansbury; 29.04.2013
comment
Спасибо за всю помощь, тогда я пойду с asio, так как я уже использую boost. - person RenatoUtsch; 30.04.2013

libevent превосходен, и меня удивляет, что вы от него отказались. ZeroMQ довольно хорош, но поддержка Windows немного ограничена. RabbitMQ — мой друг в Сан-Франциско.

Boost.asio тоже очень хорош. Поскольку кажется, что вы ограничены C ++, я использую libevent, и он должен намного превосходить другие MMO-игры, над которыми я работал, с точки зрения сетевой задержки и отзывчивой сети, но для этого требуется tcp.

person Mickey Kawick    schedule 29.04.2013
comment
Проблема libevent (и libev) в том, что их поддержка Windows не очень хороша. За исключением этого, это кажется очень хорошим. Затем я нашел libuv, который был сделан в качестве замены libev на node.js, заявляя, что он быстрее и хорошо поддерживает Windows. Я действительно испытываю желание использовать его. Был ли у вас когда-нибудь опыт с этим? - person RenatoUtsch; 29.04.2013
comment
А также, что вы имеете в виду, когда говорите, что для этого требуется TCP? Разве я не могу использовать с ним только UDP? - person RenatoUtsch; 29.04.2013
comment
libevent кажется отличным ... Я использую его здесь около 2 месяцев, и он очень отзывчив. Лучшая поддержка для libevent — TCP. Тем не менее, есть некоторая поддержка... но не то, что вам нужно, например, заказ пакетов и поддержание активности. IOW, вам нужно будет реализовать их так же, как и в обычном udp. Кроме того, вам может быть интересно прочитать эту ссылку. stackoverflow.com/questions/11361208/ - person Mickey Kawick; 30.04.2013
comment
Ну да, у меня нет особого выбора, так как я делаю сервер для клиента с закрытым исходным кодом. Спасибо за помощь, пойду с asio. - person RenatoUtsch; 30.04.2013