2013-04-28 163 views
6

我目前正在重寫一個非常古老的mmorpg的服務器端,我正在尋找一個很好的開源網絡庫來使用C/C++。由於客戶端已經存在,我不能使用任何實施某種數據包結構或通信的庫(例如RakNet)。MMORPG服務器端網絡庫(libuv/boost :: asio?)

服務器將主要在三個不同的端口上使用UDP。

在互聯網上搜索後,我發現有關boost :: asio和libuv。

boost :: asio似乎是一個成熟的選擇,因爲我已經在使用boost了,但是我讀到他們的UDP實現有點差,並且它無法實現多核處理器的最大性能,因爲一些使用epoll時鎖定。

libuv看起來不錯,是由事件驅動的,由一個大項目支持,但目前沒有這種項目使用它,所以我對使用它沒有疑問。

你有什麼想法?我可以在這樣的項目中使用libuv,還是必須使用boost :: asio?我也接受其他建議(他們需要跨平臺,我已經放棄了enet,libevent和libev)。

+0

[liblacewing](http:// lacewing-project。org)也可能非常適合(在Windows上支持epoll,kqueue或IOCP)。披露:我是主要開發者。 – 2013-04-29 12:28:18

+0

很酷的項目,我會看看,但我很想使用asio,因爲我已經使用boost了。 – RenatoUtsch 2013-04-30 16:29:47

+2

@RenatoUtsch嗨Renato,一年後,你選擇了什麼?你能給我們一些回報嗎?謝謝 – 2014-06-02 15:43:20

回答

4

libuv或Boost.Asio應該沒問題。我在實時和近實時應用程序中觀察到類似的結果。

如果你使用Boost.Asio的,要注意的:

  • 如何最大限度地減少的handler memory allocation量。
  • io_service鎖定可以通過提供併發注入的1到io_serviceconstructor來消除。但是,這不會阻止反應堆內的鎖定。

我與遊戲開發經驗:

  • 如果網絡功能通過一個接口或隊列提供給遊戲代碼,那麼它是相當微不足道的一個基於事件的庫之間交換到另一個基於事件的庫,如Boost.Asio和libuv。
  • 服務器體系結構比網絡代碼本身具有更多的影響。 Boost.Asio和libuv都提供IPC功能,這對於多守護進程服務器體系結構可能很有用。

雖然兩個庫之間有一些重疊,但可能需要閱讀this比較。

+0

但是,如果我指定'concurrency_hint'爲1,那麼io_service將只在單個線程上運行。我怎樣才能利用多線程呢? 感謝您的比較,它確實幫助了很多。 – RenatoUtsch 2013-04-29 15:49:26

+0

您可以使用多個'io_service'對象。這種方法類似於libuv,因爲libuv支持多個事件循環,但它不支持從多個線程運行相同的循環。通過Boost.Asio,如果您不設置_concurrency_hint_,那麼多個線程可以安全地爲事件循環提供服務。 – 2013-04-29 16:34:56

+0

但未設置concurrency_hint將導致反應堆鎖定問題。那麼,我將根據處理器的核心數量啓動各種io_service對象。 我在讀asio的UDP實現不是很好,是真的嗎?如果它有所不同,我將不得不使用libuv。你知道這件事嗎? – RenatoUtsch 2013-04-29 16:45:04

1

libevent非常好,它令我驚訝,你已經拋棄了它。 ZeroMQ非常好,但Windows支持稍有限制。 SF中的RabbitMQ是我的一個惡魔。

Boost.asio也很好。既然看起來你只限於C++,那麼libevent是我正在使用的,它應該遠遠超過我在網絡延遲和響應網絡方面工作過的其他MMO遊戲,但它確實需要tcp。

+0

libevent(和libev)的問題是他們的windows支持不是很好。除此之外,它確實非常好。然後,我發現libuv,它是作爲node.js上的libev的「替代品」,聲稱速度更快並且支持windows。我真的很想用它。你有沒有使用它的經驗? – RenatoUtsch 2013-04-29 09:35:13

+0

而且,當你說「它需要tcp」時,你是什麼意思?我不能只用UDP嗎? – RenatoUtsch 2013-04-29 09:49:03

+0

libevent看起來很棒......我現在在這裏使用了大約2個月,而且響應非常快。對libevent的最好的支持是tcp。但是,有一些支持......只是不需要像數據包訂購和保持活力那樣的東西。 IOW,您將需要像在常規udp中那樣執行這些操作。 此外,您可能會喜歡閱讀此鏈接。 http://stackoverflow.com/questions/11361208/high-performance-scalable-udp-servers – 2013-04-29 22:26:56