在多人在线 Socket.io 游戏中管理套接字。

3
我正在使用Node.js和Socket.io构建一个大型多人在线游戏。所有玩家都将在同一无限地图上移动(类似于Minecraft)。当玩家移动时,我会加载他们可见的瓦片。当玩家移动时,应该将其移动发送给所有可以看到他们的玩家。
我的问题是:我应该如何构建我的sockets?拥有一个socket来处理所有玩家似乎不太可扩展。我可以将世界划分为块,但我不确定如何管理块边界。由于大多数玩家大部分时间都看不到彼此,因此我希望每个玩家的socket仅获得与他们相关的更新。
我已经了解到Socket.io有一个“房间”的概念,即接收相同消息的socket。为每个连接的玩家创建一个单独的房间是否可行?然后,每当其他玩家移动附近时,我会将其socket添加到该房间中。然后,每次玩家移动时,我可以向该房间发送消息。那么,当观众离开或加入房间时,我该如何管理?
显然,这是一个模糊的问题,但我只是寻求最佳实践建议。如果有关于此主题的文章链接,将不胜感激。

1
你有没有考虑使用四叉树来查找玩家位置?一个好的开始寻找如何处理这个问题的地方是BrowserQuest源代码 - hughsk
1个回答

5

这是设计MMO服务器时必须解决的一个重要问题。通常,您希望每个客户端都有一个套接字,并实现将客户端“订阅”到特定区域的逻辑。

区域是设置“频道”以控制数据订阅的好方法。您可以为每个区域设置离散的名称,并使用 Socket.io 房间来将玩家订阅到该区域。

在所有这些内容都进行了之后,处理起来会更加容易。因此,如果玩家移动到特定区域,服务器只需将“玩家移动”事件发送给该事件X米范围内的所有区域的所有订阅者即可。


1
“每个客户端一个套接字”是什么意思?它是指每个客户端一个WebSocket服务器(因此每个客户端具有不同的IP或端口),还是在同一服务器IP/端口中每个客户端一个连接?我也遇到了相同的问题,尽管使用的是Ratchet。 - Jack M.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接