我在Socket.io中使用自己的房间实现(得到我自己的房间/播放器类),因为我需要在房间里执行几个过滤器。现在,我将所有套接字保存在一个房间内的“玩家”属性中,并将自己的“发射”实施到房间,循环播放器并发射到他们的插座。
传统的broadcast.to('room')是否相当慢?或者它基本上对我自己的房间实施做了什么?我的目标是拥有成千上万的房间,每个房间有2-4名玩家......
谢谢:)
答案 0 :(得分:1)
正如您可以通过查看the code for the socket.io adapter .broadcast()
on GitHub看到的,所有socket.io正在进行循环查看套接字列表并向每个套接字发送数据包(请参阅下面的代码)。
因此,如果您的代码执行类似的操作,那么性能可能会类似。
如果您使用自定义适配器(例如用于群集的redis适配器),您可能会注意到功能差异,那么内置的连接到不同服务器的用户的逻辑将由您处理适配器,但如果你自己做广播,可能是你必须自己实现的东西。
这是.broadcast()
的socket.io-adapter版本:
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);
}
}
}
});
};