2016-10-17 3 views
-1

Socket.ioで自分の部屋の実装を使用しています。私は部屋をいくつかフィルタリングする必要があるので、自分のRoom/Playerクラスを持っています。今のところ、部屋の「選手」プロパティ内にあるすべてのソケットを保存し、ルームに自分自身の「放出」を実装して、プレーヤーをループしてソケットに放出します。ルームブロードキャスト対ソケット放出 - 同じですか?

従来のブロードキャストよりもかなり遅いですか(「ルーム」)?それとも私は自分の部屋の実装にしたことを基本的にしていますか?私はthe code for the socket.io adapter .broadcast() on GitHubを見て、あなたが見ることができるように

感謝:)

答えて

1

...それぞれに2-4プレーヤー付きの客室、数千を持っ上を目指しています、すべてのsocket.ioは、リスト上でループしているやっています各ソケットにパケットを送信します(下記のコードを参照)。

あなたのコードが似たようなことをしている場合、パフォーマンスは類似している可能性があります。

クラスタリングで使用されるRedisアダプタなどのカスタムアダプタを使用している場合は、異なるサーバーに接続されているユーザーにブロードキャストするロジックが、あなた自身のブロードキャストを行う場合は、自分で実装する必要があるかもしれません。

はここ.broadcast()のsocket.ioアダプタのバージョンです:

Adapter.prototype.broadcast = function(packet, opts){ 
    var rooms = opts.rooms || []; 
    var except = opts.except || []; 
    var flags = opts.flags || {}; 
    var packetOpts = { 
    preEncoded: true, 
    volatile: flags.volatile, 
    compress: flags.compress 
    }; 
    var ids = {}; 
    var self = this; 
    var socket; 

    packet.nsp = this.nsp.name; 
    this.encoder.encode(packet, function(encodedPackets) { 
    if (rooms.length) { 
     for (var i = 0; i < rooms.length; i++) { 
     var room = self.rooms[rooms[i]]; 
     if (!room) continue; 
     var sockets = room.sockets; 
     for (var id in sockets) { 
      if (sockets.hasOwnProperty(id)) { 
      if (ids[id] || ~except.indexOf(id)) continue; 
      socket = self.nsp.connected[id]; 
      if (socket) { 
       socket.packet(encodedPackets, packetOpts); 
       ids[id] = true; 
      } 
      } 
     } 
     } 
    } else { 
     for (var id in self.sids) { 
     if (self.sids.hasOwnProperty(id)) { 
      if (~except.indexOf(id)) continue; 
      socket = self.nsp.connected[id]; 
      if (socket) socket.packet(encodedPackets, packetOpts); 
     } 
     } 
    } 
    }); 
}; 
+0

恐ろしい、どうもありがとう:) – trueicecold

関連する問題