2

Rubyでゲームサーバーを書こうとしています。ゲームの 1 つの機能には、プレイヤーが歩き回る機能が含まれており、他のプレイヤーはそれを見ることができるはずです。

イベント マシンを使用して、純粋なソケットのデモを既に作成しました。しかし、ほとんどの通信は http ベースになるため、http ポーリング ソリューションを探しています。もちろん、イベントマシンで書くこともできますが、この種の仕事のための宝石はすでにありますか?

faye のようなものを試してみましたが、これらのほとんどは、チャネルの購読や公開などのメッセージング システム用であり、プッシュするクライアントを制御できないようです。私の場合、特定のクライアントにプッシュできるようにする必要があります。たとえば、1 人の男が 10,10 から 20,20 に移動し、その周りの人だけ (おそらく 0,0 から 30,30 に移動しますが、40,50 の男には移動しません) ) メッセージを受信する必要があります。

------------けいれんを伴う前進行

ここに簡単な更新があります。私はクランプに取り組んでおり、接続数は 5000 で、毎秒 100 クライアントが移動しています。CPU 使用率はほぼ 100% です。両方の数値を 2 倍にしても、CPU 使用率は 100% 程度のままで、応答が非常に遅くなります。

明らかに、所有していたすべてのリソースを使用しているわけではありません。代わりに、占有されている CPU コアは 1 つだけです。さらに作業が必要です。

------------Node.jsの番

@aam1r 実際、Node.js はクランプよりも優れています。5000 の接続と 1 秒あたり 100 のクライアントの移動で、CPU 使用率は 60% を超えています。10000 接続と毎秒 200 クライアント移動に倍増すると、CPU 使用率は 100% になり、応答が遅くなります。ここでも同じ問題があります。cramp または Node.js は、プロセスごとに 1 つの CPU コアしか使用できません。それは問題だ。

------------JRubyはどうですか?

GILが存在するため、Ruby MRI では真のマルチスレッド同時実行はありません。Node.js にもありません。だから、JRuby を試してみます。

  • クライアントが移動すると、別のスレッドを使用して、他のすべてのクライアントが通知する必要があることを見つけます (これは CPU を大量に使用する作業です)。次に、結果をチャネルにプッシュします。

  • メイン スレッドは単にチャネルをサブスクライブします。結果が得られたら、それらをクライアントにプッシュします。

ただし、デモを作成するには時間が必要です。

4

2 に答える 2

2

Server-Sent Events でEspressoを使用することをお勧めします。

サーバー側では、ストリーミング アクションを定義します。

class App < E
  map :/

  attr_reader :connections

  def subscribe
    @connections ||= []
    stream :keep_open do |conn|
      connections << conn
      conn.callback { connections.delete conn }
    end
  end

  private
  def communicate_to_clients
    connections.each do |conn|
      conn << 'some message'
    end
end

:keep_open オプションは、サーバーに接続を閉じないように指示します。

次に、Javascript で接続を開きます。

pool = new EventSource('/subscribe');
pool.on_message = function(msg) {
  // here you receive messages sent by server
  // via communicate_to_clients method
}
于 2012-11-10T18:26:33.927 に答える
1

ポーリングを使用しないことをお勧めします。新しいリクエストを行うたびに新しい接続を確立するため、ポーリングによってオーバーヘッドが大きくなりすぎます。また、リアルタイムでは十分ではありません(つまり、X秒ごとにポーリングします-即座にではありません)

代わりに、Crampのようなものを使用することをお勧めします。彼らのウェブサイトから:

Crampは、Rubyの完全に非同期のリアルタイムWebアプリケーションフレームワークです。これはEventMachineの上に構築されており、主に多数のオープン接続を処理し、全二重双方向通信を提供するように設計されています。

すべてのクライアントは、メッセージを送受信できる永続的な接続を維持します。クライアントが「X秒ごと」にチェックを行わないため、毎回新しい接続を確立するオーバーヘッドはなく、メッセージはリアルタイムで送信されます。

Crampの代わりにNode.jsを使用することもできます。これは、リアルタイムアプリケーションの開発に使用できるJavascriptフレームワークです。

ここにあなたを助けるべきいくつかのより多くのリソースがあります:

于 2012-11-10T15:39:35.617 に答える