2013-04-28 24 views
6

Obecnie przepisuję stronę serwera bardzo starego mmorpg i szukałem dobrej biblioteki sieciowej opensource do użycia z C/C++.Biblioteka sieciowa po stronie serwera mmorpg (libuv/boost :: asio?)

Ponieważ klient już istnieje, nie mogę używać żadnej biblioteki, która wymusza jakąś strukturę pakietów lub komunikację (jak na przykład RakNet).

Serwer będzie korzystał głównie z protokołu UDP na trzech różnych portach.

Po przeszukaniu w Internecie dowiedziałem się o boost :: asio i libuv.

doładowanie :: asio wydaje się być dojrzałą opcją, ponieważ będę już używał boost, ale czytałem, że ich implementacja UDP jest trochę słaba, i że nie może osiągnąć maksymalnej wydajności procesora wielordzeniowego z powodu niektóre blokady podczas korzystania z epoli.

Wydaje się, że libuv jest świetny, napędzany jest zdarzeniami, wspierany przez duży projekt, ale obecnie nie ma tego rodzaju projektu, więc mam wątpliwości, czy go użyć.

Co wy ludzie sądzicie? Czy mogę używać libuv w takim projekcie, czy będę musiał pójść z boost :: asio? Jestem również otwarty na inne sugestie (muszą być one wieloplatformowe, a ja już odrzuciłem enet, libevent i libev).

+0

[liblacewing] (http: // lacewing-project.org) również może być do tego odpowiedni (obsługuje epoll, kqueue lub IOCP w systemie Windows). Ujawnienie: Jestem głównym programistą. –

+0

Fajny projekt, przyjrzę się temu, ale mam ochotę użyć asio, ponieważ będę już używał boost. – RenatoUtsch

+2

@RenatoUtsch Cześć Renato, a rok później, co wybrałeś? Czy możesz dać nam zwrot z twojego doświadczenia? Dzięki –

Odpowiedz

4

Albo libuv, albo Boost.Asio powinno być w porządku. Podobne wyniki zaobserwowałem między bibliotekami zarówno w czasie rzeczywistym, jak iw czasie rzeczywistym.

Jeśli używasz Boost.Asio, należy pamiętać o:

  • Jak zminimalizować ilość handler memory allocation.
  • io_service Blokowanie można wyeliminować, podając concurrency_hint z 1 na io_serviceconstructor. Jednakże nie zapobiegnie to blokowaniu w reaktorze.

Z mojego doświadczenia z tworzenia gier:

  • Jeżeli funkcje sieciowe są dostarczane do kodu gry albo poprzez interfejs lub kolejki, to jest dość trywialne, aby zamienić między jednej biblioteki zdarzeń opartych na inna biblioteka oparta na zdarzeniach, taka jak Boost.Asio i libuv.
  • Architektura serwera ma o wiele większy wpływ niż sam kod sieci. Zarówno Boost.Asio, jak i libuv zapewniają funkcjonalność IPC, która może być przydatna w architekturach wielu demona.

Chociaż niektóre biblioteki zachodzą na siebie, warto zapoznać się z porównaniem this.

+0

Ale jeśli podam 'concurrency_hint' of 1, io_service będzie działał tylko na jednym wątku. Jak zatem skorzystać z wielowątkowości? Dzięki za porównanie, to naprawdę bardzo pomogło. – RenatoUtsch

+0

Możesz użyć wielu obiektów 'io_service'. Takie podejście jest podobne do libuv, ponieważ libuv obsługuje wiele pętli zdarzeń, ale nie obsługuje tej samej pętli z wielu wątków. W przypadku Boost.Asio, jeśli nie ustawisz _concurrency_hint_, wiele wątków może bezpiecznie obsłużyć pętlę zdarzeń. –

+0

ale nie ustawienie concurrency_hint spowoduje problemy z blokowaniem z reaktorem. Cóż, wtedy uruchomię różne obiekty io_service na podstawie liczby rdzeni procesora. Czytałem, że implementacja UDP Asio nie jest zbyt dobra, czy to prawda? Jeśli to robi różnicę, będę musiał mimo wszystko używać libuv. Czy wiesz coś o tym? – RenatoUtsch

1

libevent jest doskonały i zaskakuje mnie, że go wyrzuciłeś. ZeroMQ jest całkiem niezły, ale obsługa Windows jest nieco ograniczona. RabbitMQ jest przez mojego diabła w SF.

Boost.asio jest również bardzo dobry. Ponieważ wydaje się, że jesteś ograniczony do C++, to libevent jest tym, czego używam i powinien znacznie przewyższać inne tytuły MMO, nad którymi pracowałem pod względem opóźnień sieciowych i responsywnych sieci, ale wymaga to tcp.

+0

Problem libevent (i libev) polega na tym, że obsługa Windows nie jest zbyt dobra. Poza tym, wydaje się bardzo dobre. Następnie znalazłem libuv, który został stworzony jako "zamiennik" dla libev na node.js, twierdząc, że jest szybszy i dobrze obsługuje okna. Naprawdę mam ochotę go użyć. Czy kiedykolwiek miałeś z tym doświadczenie? – RenatoUtsch

+0

A także, co masz na myśli mówiąc, że "to wymaga Tcp"? Czy nie mogę używać z nim tylko UDP? – RenatoUtsch

+0

libevent wydaje się świetny ... Używam go tutaj przez około 2 miesiące i jest bardzo responsywny. Najlepszym wsparciem dla libevent jest tcp. Istnieje jednak pewne wsparcie ... po prostu nie potrzebne rzeczy, takie jak porządkowanie pakietów i utrzymywanie przy życiu. IOW, będziesz musiał zaimplementować je tak jak w zwykłym udp. Możesz również przeczytać ten link. http://stackoverflow.com/questions/11361208/high-performance-scalable-udp-servers –

Powiązane problemy