【发布时间】:2016-12-13 16:35:33
【问题描述】:
我正在编写一个实时多人游戏(使用 Nodejs、socket.io),我想请你帮忙优化一点。
我用 60 次/s 的更新循环和 20 次/s 的广播循环、客户端预测和插值实现了一个权威服务器。 然后,在广播循环中,我尝试了导致性能问题的区域广播。
为了简约,服务器有以下数组:
- 玩家实体(id + 位置)
- 食品实体(id + 位置)
让我们在服务器的数组 server.foods 中的大地图(就像 agar.io)中生成 1000 种食物。玩家只需要知道他视口中食物的状态(比如 200 种可见的食物)。因此,服务器只向玩家发送带有 200 个可见食物(id + 位置)的 一个数据包。然后,为了让服务器知道,我们将 200 种可见食物推送到 Player 对象 (player.foods) 中的数组中
但是玩家可以移动,所以必须发送其他数据包:
initFoods 是要初始化的食物数组(id+位置)(仅当新食物对玩家可见时:distFoodPlayer )
removeFoods 是要删除的食物数组(id+位置)(仅当新食物对播放器不可见时:distFoodPlayer > 600)
要了解这些信息,我会这样做:
for (var i = server.foods.length; i--;) {
//Edit: added the next line
if (distPlayerFood < 900) {
var food = server.foods.entities[i];
var inPlayerFoods = false;
for (var j = player.foods.length; j--;) {
if (food.id === player.foods[j]) {
inPlayerFoods = true;
if (distPlayerFood > 600) {
removeFoods.push(food.id);
player.foods.splice(i, 1);
}
}
}
if (distPlayerFood < 500) {
if (!inPlayerFoods) {
player.foods.push(food.id);
initFoods.push([food.id, food.state]);
}
}
}
});
1000 种食物和 1 名玩家的性能还可以(服务器的更新循环保持 ~58FPS)。但是对于 5000 种食物和 1 名玩家(或 1000 种食物和 5 名玩家),由于这种双循环(服务器最高可达 ~25-40FPS),性能真的很差,但带宽却被最小化了。 性能测试已在我的计算机 (localhost) 上完成。也许有了更大的服务器,我就不会有这些问题了?
你认为我的做法不错吗?你有更好的主意吗?
非常感谢。
编辑:我将代码更改为只检查不太远的食物。服务器将达到最大 ~35-50FPS
【问题讨论】:
标签: javascript node.js performance sockets