2013-04-28 12 views
6

私は現在非常に古いmmorpgのサーバー側を書き換えていますが、私はC/C++で使用するのに適したオープンソースネットワークライブラリを探していました。mmorpg(libuv/boost :: asio?)のサーバー側のネットワークライブラリ

クライアントが既に存在するため、何らかの種類のパケット構造や通信(RakNetなど)を実行するライブラリは使用できません。

サーバーは3つの異なるポートで主に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をサポートしています)。開示:私は主​​な開発者です。 –

+0

クールなプロジェクト、私はそれを見るつもりですが、私はすでにブーストを使用するので、asioを使用するように誘惑されています。 – RenatoUtsch

+2

@RenatoUtschこんにちはRenato、そして1年後、あなたは何を選んだのですか?あなたの経験にいくつかのリターンを教えてください。ありがとう –

答えて

4

libuvまたはBoost.Asioのいずれかが問題ありません。私はリアルタイムとほぼリアルタイムの両方のアプリケーションでライブラリ間で同様の結果を観察しました。あなたがBoost.Asioを使用する場合

は、注意してください。

  • handler memory allocationの量を最小化する方法。
  • io_serviceio_serviceconstructor concurrency_hintの1を指定すると、ロックを解除できます。しかしながら、これは原子炉内でのロックを妨げない。ゲーム開発での私の経験から

  • ネットワーク機能は、インターフェイスまたはキューのいずれかを介してゲームのコードに提供されている場合、1つのイベントベースのライブラリーの間で交換することはかなり簡単ですBoost.Asioやlibuvなど、別のイベントベースのライブラリ。
  • サーバーアーキテクチャは、ネットワークコード自体よりもはるかに大きな影響を与えます。 Boost.Asioとlibuvは、マルチデーモンのサーバアーキテクチャに役立つIPC機能を提供します。

2つのライブラリの間に重複がありますが、比較するとthisを読む価値があります。

+0

しかし、1のconcurrency_hintを指定すると、io_serviceは1つのスレッドでのみ実行されます。マルチスレッドを利用するにはどうすればよいですか? 比較のおかげで、本当に多くの助けになりました。 – RenatoUtsch

+0

複数の 'io_service'オブジェクトを使うことができます。 libuvは複数のイベントループをサポートしているので、このアプローチはlibuvと似ていますが、複数のスレッドから同じループを実行することはサポートしていません。 Boost.Asioでは、_concurrency_hint_を設定しないと、複数のスレッドが安全にイベントループを処理できます。 –

+0

ただし、concurrency_hintを設定しないと、原子炉にロック問題が発生します。では、プロセッサのコア数に基づいてさまざまなio_serviceオブジェクトを起動します。 私はasioのUDP実装があまりよくないと読んでいましたが、それは本当ですか?違いがある場合は、結局libuvを使用する必要があります。あなたはそれについて何か知っていますか? – RenatoUtsch

1

libeventは優れていて、あなたがそれを捨てたことは驚きです。 ZeroMQはかなり良いですが、Windowsのサポートはわずかです。 RabbitMQはSFの私の悪魔にされています。

Boost.asioも非常に良いです。あなたがC++に限定されているようだから、libeventは私が使っているもので、ネットワークレイテンシやネットワークのレスポンスの面で他のMMOタイトルよりも優れているはずですが、tcpが必要です。

+0

libevent(とlibev)の問題は、ウィンドウのサポートがあまり良くないということです。それを除いて、それは確かにとても良いようです。それから、node.js上のlibevの "置き換え"として作られたlibuvが見つかりました。私は本当にそれを使用するように誘惑されています。あなたはこれまでに経験をしたことがありますか? – RenatoUtsch

+0

また、「それはtcpを必要とする」と言ったとき、あなたはどういう意味ですか? UDPだけを使用することはできませんか? – RenatoUtsch

+0

libeventは素晴らしいようです...私は約2ヶ月間ここでそれを使用しています、そして、それは非常に敏感です。 libeventの最適なサポートはtcpです。しかし、いくつかのサポートがあります。パケットの注文や生き続けるようなものは必要ありません。 IOW、通常のudpと同じようにこれらを実装する必要があります。 また、このリンクを読んでお楽しみください。 http://stackoverflow.com/questions/11361208/high-performance-scalable-udp-servers –