gpt4 book ai didi

node.js - 关于向客户端广播消息的逻辑问题

转载 作者:太空宇宙 更新时间:2023-11-04 01:50:45 25 4
gpt4 key购买 nike

我目前正在使用套接字在 Node js 上开发游戏。

如果您能想象一个多人游戏并拥有 3 个独立的房间。所以我进入网站,房间 1 有 16/16 名玩家,所以我去了房间 2。这样的交易。

从逻辑上讲,在房间 1 中运行的游戏的游戏信息应该只发送给房间 1 中的用户,所以类似这样。

for (var i = 0; i < this.rooms.length; i++){
for (var j = 0; j < this.rooms[i].players; j++){
io.sockets.connected[this.rooms[i].players[j].socketid].emit('updateGame', this.rooms[i]);
}
}

我还没有测试过它或任何东西,但这就是它背后的一般逻辑。

它看起来服务器负载很大,因为它是一款快速移动的游戏,如果规模更大,可能会有 500 名玩家,每人 60 fps。

或者我可以将所有游戏的信息发送给每个人

this.socket.of('game').emit('updateGame', this.rooms);

并显示正确的一个客户端。

考虑到服务器压力、效率、最佳实践等,逻辑上最好的是什么。这似乎是第二个,但当客户端只玩 1 次时将每个游戏/房间发送给客户端的想法让我有点烦恼。

最佳答案

关于处理加入现有房间或创建新房间我认为你可以在服务器端使用这样的Redis适配器:

const io = require('socket.io')(3000);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));

io.on('connection', function(client) {
//Get allRooms by Redis Adapter
io.of('/').adapter.allRooms((err, rooms) => {
let statusJoinedRoom = false
for (let room of rooms) {
if (socket.id !== room) {
let numClients = io.sockets.clients(room).length
if (numClients <= MAX_CLIENTS_IN_ROOM) {
socket.join(room, () => {
console.log(`Joined room: ${room}`)
statusJoinedRoom = true
break
}
}
}
}
if (!statusJoinedRoom) {
socket.join(`room${rooms.length+1}`, (){
console.log('Created new room')
})
}
})
})

工作流程为:Get all rooms -> Check count clients in each Room -> Join if count clients < MAX_CLIENTS_IN_ROOM -> Create new room if all Rooms full

关于性能Redis缓存将有助于存储房间、客户端数据。正常情况下,这些数据将保存在 Node 线程的内存中。

关于emit对于同一房间的所有客户,您可以使用此

socket.to(socket.rooms).emit('hello', "to all clients in room except sender")

希望这有帮助!

关于node.js - 关于向客户端广播消息的逻辑问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49799086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com