2016-10-17 2 views
-1

Я использую реализацию собственных комнат в Socket.io (получил собственные классы Room/Player), так как мне нужно выполнить несколько фильтров в комнате. На данный момент я сохраняю все сокеты внутри свойства «игроков» в комнате, и реализовал мой собственный «излучать» в комнату, петли игроков и испускает их сокеты.комнатная трансляция против сокетов emit - они одинаковы?

Это значительно медленнее традиционной broadcast.to ('room')? или это в основном делает то, что я сделал с моей собственной реализацией комнаты? Я прицеливание на том тысячи номеров с 2-4 игроками в каждом ...

Спасибо :)

ответ

1

Как вы можете видеть, глядя на the code for the socket.io adapter .broadcast() on GitHub весь socket.io делает зацикливается по списку сокетов и отправки пакета каждому из них (см. код ниже).

Итак, если ваш код делает что-то подобное, тогда производительность, скорее всего, будет чем-то подобным.

Если вы заметили разницу в характеристиках, это если вы используете пользовательский адаптер, такой как адаптер redis, который используется с кластеризацией, тогда логика вещания для пользователей, подключенных к различным серверам, будет обрабатываться для вас встроенным адаптером, в адаптере, но может быть что-то, что вам нужно было бы реализовать самостоятельно, если вы делаете свою собственную трансляцию.

Вот версия socket.io-адаптер .broadcast():

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

Awesome, спасибо :) – trueicecold

Смежные вопросы