1

私は現在JavaNIOを読んでいて、過去に自分でJavaNIOのいくつかの実装を作成しました。しかし、私はサーバーのパフォーマンスについて実際に考えたことはありません-それは本当にばかげているように見えます、そしてそれはそうです。シングルスレッドのリアクターでいいと言われるのを聞いたことがありますが、私は自分の持っているコアを本当に活用したいと思っています。

私が作成する実装はゲームなので、ゲームロジックスレッドもいくつかあるので、多くのスレッドを使用することはできません。どちらかといえば、おそらく2つだけです。

これが私が思いついたプロットです:

  • 優先度の高いリアクター
    1. 接続を受け入れます
    2. ゲームのログインプロセスを処理します(クライアントはパケットを送信し、サーバーはプロセスを送信し、サーバーは応答パケットを送信します。ここでは大量のデータではありません)
    3. リソースファイルデータをオンデマンドで配布します(ゲームは、クライアントがゲームのほぼすべてのリソースを含むキャッシュに保存するデータをサーバーが送信するように構築されています。これのほとんどは、ゲームの読み込み時に行われますが、それでも多くのことが発生します演劇としてのバックグラウンドで)
  • 標準リアクター
    1. ゲーム内のパケットを読み取って応答します。これらは小さいことが多いですが、多くの場合、プレーヤーが行うことのほぼすべてがパケットとして配布されるため、約200人のプレーヤーを適切に処理できるように拡張したいと思います)

目標:

  • 約200〜300人のプレーヤーに適したスケール
  • ゲームパケットにすばやく応答する
  • 前述のファイルデータをすばやく配布する
  • 接続をすばやく受け入れる

また、あなたがそれに精通しているなら、ゲームはRuneScapeです。私の目標は、RuneScapeの公式サーバーソフトウェアをエミュレーションして、クライアントの1つで使用できるようにすることです。これは一般的な方法です。www.runelocus.comwww.rune-server.orgを参照してください。

私の質問は、これは良い実装になると思いますか?原子炉を1つだけ持つ方が良い考えですか?それとももっと使うべきですか?送受信されるデータはほぼ同じで、優先度の高いリアクターではもう少し多いと思います(これが優先度の高い理由です)。

また、私がそれを高優先度と定義するとき、私は実際にはそれを標準的な原子炉よりも文字通り優先しているわけではありません。ゲームパケットよりも重要と見なされるタスクを処理しているだけです。

フィードバックは大歓迎です:)説明/説明が必要な場合は、lemmeが知っています!

4

2 に答える 2

0

これは良い実装だと思いますか?

100 ~ 1000 の接続の場合、NIO またはおそらく古い IO をブロックする接続モデルごとに 1 つまたは 2 つのスレッドを使用します。これは多くの場合、実装がはるかに簡単で、この数の接続に対してほぼ同じくらい効率的です。無料のコアがある場合は、簡単にできるほど良いです。明らかに、このモデルはすべてのコアを問題なく使用できます。;)

于 2012-06-15T07:36:10.673 に答える
0

Rune-Server で何度も説明したように、これは理想的なアプローチです。これは、RuneScape プロトコル (およびおそらく他のサイクルベースのゲーム) にとって非常に有益です。

最終的な目標は、ネットワーク フレームをパケット オブジェクトにエンコード/デコードし、後で処理するためにそれらをキューに入れることのオーバーヘッドを回避および削減することです。RuneScape のサイクル ベースの処理を順守し、同期を行わずにバッファから安全に直接読み取ることができれば、このタスクから可能な限り多くのオーバーヘッドを排除したことになります。

2 番目の優先度の高いリアクタの目的は、パフォーマンス上の理由ではなく、クライアントとログイン プロセスを受け入れるためのレイテンシを短縮することです。また、遅延を可能な限り少なくする必要があるキャッシュの更新にも適しています。

于 2012-06-23T06:26:15.313 に答える