我正在使用 Socket.io 和 Node.js 开发一个简单的多人游戏。我遇到了一些性能问题并尝试调试以找出可能存在内存泄漏的位置。发生的情况是,每个添加到游戏中的玩家的 CPU 使用率都会持续增加约 10%,然后保持稳定,直到我最终添加另一个玩家(它会再增加 10%)或断开玩家连接(减少 10%)。
在我研究了一段时间后,我发现这种增加的原因是服务器端的“发射”。服务器看起来像这样:
var clients = [];
io.sockets.on('connection', function(socket){
//logic for adding this player to the game arena, that runs
//only one time (when the client connects)
var id = addToGame();
//add the id of this player in the 'clients' list
clients.push({
id: id,
socket: socket
});
socket.on('disconnect', function(){
//remove the player from the game.
//delete the client'id from the list of 'clients'
});
});
setInterval(update, 30);
function update() {
for (var client of clients) {
var player = findPlayerById(client.id);
var message = getMessageForPlayer(player);
client.socket.emit('update client', message);
}
}
我认为问题在于我多次使用匿名函数,所以我改变了它,但它似乎没有做任何事情。
所以,在弄乱了代码之后,我意识到当我注释掉这一行时
client.socket.emit('update client', message);
当新玩家出现时,CPU 使用率似乎根本没有增加。这是有道理的,因为游戏会运行,因此游戏竞技场中总是有一定数量的玩家。这些玩家最初是由 CPU 控制的,并且做的事情与人类玩家能够做的事情完全相同。当人类玩家加入游戏时,他们只是取代了现有 CPU 玩家,因此无论所有玩家是 CPU 还是真正的人类玩家,更新游戏时发生的计算大致相同。
唯一的区别在于在发出“更新客户端”消息之前运行的计算。这只发生在人类玩家身上。所以我认为这是有道理的,因为 for 循环会为每个人类玩家查询游戏,这可能是 CPU 使用率增加的原因。但令我大吃一惊的是,即使您将所有这些计算保持原样,并简单地取出“发射”部分,问题就会消失(无论您添加多少玩家,CPU 使用率都会保持稳定)。
我认为这是我应该期待的,因为我正在使用来自 Digital Ocean 的测试专用服务器,具有 1Gb 的 RAM 和 1 个 CPU(发出的消息也是平均约 150 个元素的数组,将每个元素视为一个包含10 个字符串作为元素)。
我的问题是:我如何才能获得一个 CPU 容量允许我容纳 500 名或更多玩家的服务器?就我目前的这个,游戏逻辑本身占用了大约40%的CPU,每增加一个玩家,CPU就增加10%,如果没有CPU使用率达到100%并重新启动,很难达到只有10个玩家。
我正要从 OVH 获得一台 32Gb、4 核的服务器,但我想了解比我更了解这方面的人的观点。我应该在 CPU 中寻找什么才能在 CPU 不发生故障的情况下发出这些消息?