15

マルチプレイヤーゲームのサーバー側ネットワークを書いています。このゲームはRPGであり、絶対最大収容人数は2000人ですが、実際には約300人で最大になりますが、それより多い場合も少ない場合もあります。長い間、多くのクライアントが関与するネットワーキングを行う必要があるたびに、何百ものスレッドを使用する必要がなかったため、NIOに固執してきました。最近、2つのモデルを詳細に説明したPowerPointプレゼンテーションに出くわしました。これにより、クライアントごとのスレッドモデルがNIOよりも優れているように見えました。また、古いIOが実際にNIOよりも優れている可能性があると記載されている場所も見つけました。

PowerPointはここにあります(少し古いです): http: //www.mailinator.com/tymaPaulMultithreaded.pdf

私はまだコンテンツを書いていませんので、ネットワーク設計全体を変更する必要があったとしても、最初から始めるのは問題ありません。私は時間のプレッシャーはありません。当初、私はNIOを使用してReactorパターンの実装を設計していました(イベントを選択し、イベントを処理するハンドラーをディスパッチします)。

詳細については、http://en.wikipedia.org/wiki/Reactor_patternを参照してください。

私のreactorの実装全体は、単一のスレッドを使用するように設計されています。古いIOの方が優れている可能性があることを読んだので、実際にはジレンマに陥りました。すべてのCPUパワーを最大限に活用するためだけに複数のスレッドを使用する複雑なNIOシステムを設計したくはありませんが、単一のアプリケーションで300以上のスレッドを使用するという考えにも固執しています。私の目的に合ったデザインはどれですか?クライアントごとのスレッドの利点は、本質的にすべてのCPUパワーを実際に利用することですが、同時に、システムを停止させます。言うまでもなく、単一スレッドのスタックサイズは、多くのメモリを消費します(数百倍にした場合)。リアクターパターンに固執する必要がありますか?

この質問は少し曖昧ですが、このサイトや自分の問題を扱っているウェブサイトで質問を見つけることができなかったので、自分の状況に合わせて具体的に質問する必要があると感じています。ゲームに関するものが1つありましたが、ゲームは数万人のプレーヤーを処理することを目的としていました。

どうもありがとう!説明が必要な場合は、お問い合わせください。

4

1 に答える 1

10

すべてのCPUパワーを最大限に活用するためだけに複数のスレッドを使用する複雑なNIOシステムを設計したくはありませんが、単一のアプリケーションで300以上のスレッドを使用するという考えにも固執しています。私の目的に合ったデザインはどれですか?

私たちのJVMは、500を超えるスレッドで継続的に実行され(現在は700まで)、1000年代にピークがあります。800スレッドが何らかの形で「クリンジ」に値すると考える理由はありません。(ボールパーク番号として)10,000スレッドに達すると、心配し始めます。32ビットで実行している場合はおそらくそれより少なくなります。確かに、1000年代になると、より多くのメモリを割り当てる必要がありますが、1,000スレッド未満のものは問題になりません。これがスレッド作成番号に関する良いページです。

NIOは、 IOの頻度が低い接続が多数ある場合に最も効率的です。非同期通信に関しては多くの問題を解決し、「古いIO」では機能的な観点からはできないことがありますが(たとえば、割り込み可能なチャネルやノンブロッキングIO)、シングルスレッドハンドラーははるかに単純なモデルであり、多くの構成でNIO実装よりも優れたパフォーマンスを発揮できることは驚きではありません。NIOを使用すると、JVMまたはネイティブコードのカーネルで実行される多くの操作をJavaコードで実行できます。ストリームの多重化と準備ができたIOの処理はすべて、「古いIO」モデルで(複雑さの点で)「無料」で得られるものです。

私はそれを単純に保ち、複雑さを打つ正当な理由があるまで、クライアントごとのスレッドのパターンに固執します。

于 2012-04-11T21:03:24.503 に答える