实时多人游戏 – 地区广播

我正在编写一个实时的多人游戏 (使用Nodejs,socket.io),我想问你的帮助来优化一个点。

我实现了一个更新循环60次/秒和广播循环20次/秒 ,客户端预测和插值的权威服务器。 然后,在广播循环中,我尝试了导致性能问题的区域广播

为了极简主义,服务器有数组:

  • 玩家实体(id +位置)
  • 食品实体(ID +职位)

让我们在一个大的地图(如agar.io)中产生1000个食物 ,在服务器的数组server.foods中。 玩家只需要知道他的视口中的食物状态(比方说200种可见的食物 )。 所以,服务器只发送一个包含200个可见食物(id +职位)的包给玩家。 然后,为了让服务器知道,我们将200个可见食物放入播放器对象( player.foods )中的一个数组中,

但玩家可以移动,所以其他的包必须被发送:

  • initFoods是一系列食物(id +职位)初始化(只有当新食物对玩家可见: distFoodPlayer <500

  • 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),性能是非常糟糕的,但是带宽被最小化了。 性能testing已经在我的电脑(localhost)上完成了。 也许更大的服务器,我不会有这些问题?

你认为我做了一个好方法吗? 你有更好的主意吗?

非常感谢你。

编辑 :我改变了代码,只检查不太远的食物。 服务器将达到〜35-50FPS最大虽然

algorithm的复杂性是O(n!),这就是为什么它减慢了大量的食物。 除非你的目标是让玩家在一个大的世界中移动,否则你的方法似乎很好。 一种方法来优化你的实现,我的工作将是把你的世界划分成瓷砖,每个瓷砖包含其中的食物的参考。 然后,您可以快速获得可能的范围食物列表,这样可以避免检查玩家与太远食物之间的距离。