【发布时间】:2016-10-17 18:48:18
【问题描述】:
我在 Socket.io 中使用我自己的房间实现(有我自己的房间/播放器类),因为我需要对房间执行几个过滤器。现在,我将所有套接字保存在 Room 的“玩家”属性中,并实现了我自己的“发射”到房间,循环播放器并发射到他们的套接字。
比传统的broadcast.to('room')慢很多吗?或者它基本上做了我对自己的房间实施所做的事情?我的目标是拥有数千个房间,每个房间有 2-4 名玩家......
谢谢:)
【问题讨论】:
我在 Socket.io 中使用我自己的房间实现(有我自己的房间/播放器类),因为我需要对房间执行几个过滤器。现在,我将所有套接字保存在 Room 的“玩家”属性中,并实现了我自己的“发射”到房间,循环播放器并发射到他们的套接字。
比传统的broadcast.to('room')慢很多吗?或者它基本上做了我对自己的房间实施所做的事情?我的目标是拥有数千个房间,每个房间有 2-4 名玩家......
谢谢:)
【问题讨论】:
正如您通过查看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);
}
}
}
});
};
【讨论】: