我正在使用Socket.io和Node.js进行简单的多人游戏。我遇到了一些性能问题并尝试调试以找出可能存在内存泄漏的地方。 发生的事情是,对于添加到游戏中的每个玩家,CPU使用率持续增加约10%,然后保持稳定,直到我最终添加另一个(增加另外10%)或断开玩家(减少10%)。 / p>
在我看了一会儿之后,我发现这种增加的原因是服务器端的“发射”。服务器看起来像这样:
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,并且每个玩家增加了10%的CPU,难以达到仅仅10个玩家而没有CPU使用率达到100%并重新启动。
我准备从OVH获得一台32Gb,4核的服务器,但是我想要了解那些比我更了解的人的观点。我应该在CPU中寻找什么才能在没有CPU故障的情况下发出这些消息?