一个多人游戏大厅和匹配系统的架构?

6

我计划设计一个系统,玩家可以:

  1. 运行游戏,点击进入竞技场的按钮,将其IP地址/玩家资料/网络状态发送到服务器。

  2. 匹配/大厅服务器将维护所有可用玩家的集合。它将持续寻找成对的“匹配”玩家(算法目前不重要)。

  3. 当它发现两个排队的玩家是“匹配”的时,基于玩家资料数据它将选择其中一位玩家作为服务器,然后通知游戏客户端已经找到了一场比赛。根据接收到的通知,被选为服务器的客户端将启动服务器,而另一个玩家的客户端将在准备好时连接到该初始化的服务器。

那么,如何搭建这个系统呢?我的第一个想法是通过HTTP POST发送玩家数据。但在某些情况下,可能需要等待数分钟才能找到匹配并响应玩家的连接类型和对手信息。HTTP是否适用于此?还是应该采用更底层、自定义的套接字方法?或者我完全错了?

P.S. 游戏正在使用Unity开发。我希望得到的答案不仅仅是“这是一个有效的插件”,而是要理解通常实现背后的架构。

希望能得到一些指导。


你只是在寻找大厅方面的建议吗?你是否已经考虑好了游戏内的网络架构?我想最简单的方法就是两者都使用相同的架构。 - Steven Mills
我正在使用Unity的自定义UDP网络系统进行游戏内联网。这对于我认为应该基于某些TCP技术的匹配服务器来说并不是很有效。游戏内联网很好,我只是在寻找一种好的方法来设置这个“进入竞技场”匹配系统,用户只需进入即可与另一个玩家匹配。 - mbradber
Unity内置了一些匹配功能。无论基于TCP还是UDP都不重要,因为Unity支持可靠的UDP。 - BlueRaja - Danny Pflughoeft
1个回答

6
我已经做了很多这类系统的工作。如果我是你,我会已经设置好一个http端点来处理这种情况。在游戏中使用http post/get是一个可怕的想法,但在用户界面中并不糟糕。您可以每5秒轮询一次,或者让服务器告诉客户端何时再次询问。
您还可以使用UDP来发送ping以确定客户端是否连接,而不是陷入TCP的泥潭(虽然它感觉非常安全,但不要让那些头发愚弄了您)。这样做的好处是开销比http post/gets小得多,缺点是分片和顺序(当然,如果您有一个适当的状态机,则顺序并不重要)。
因此,考虑到所有这些因素,以下是我的建议,使用http(同样可以使用udp进行一些调整,但我将使用http,因为这样我就不必涉及分段问题)。
使用托管{插入框架(WCF、WebAPI、aspx页面、甚至php)}的IIS服务器。
为了简化生活,创建一个包装器类,其中包含您需要的每个可能的api调用。
我想您想要的调用可能是这样的(->表示到服务器,<-表示从get/post的http响应)。
1 -> Hello(玩家数据。这是一个初始的竞技场握手)
1 R.1. <- Welcome(如果服务器喜欢玩家,这告诉他们他们被接受了)
1 R.2. <- Error(这个玩家因为下流行为而被禁止,没有游戏给你)
2 -> FindMatch(匹配开始查找,只要他们说“Hello”,这是询问服务器是否已经找到任何东西。您还可以捆绑统计信息,如“预计等待时间”等。这充当ping以检查客户端是否仍然活着。对此的响应将作为ping向用户发送,告诉他们他们仍然连接到服务器。您也可以实现单独的“ping”调用,这取决于您)
2 R.1 <- NothingYet(我们什么都没找到,冷静等待)
2 R.2 <- GotOne(我们找到了一个匹配项。此时,您将告诉客户端是否应启动服务器或连接。)
3 -> Leave(向匹配制度挥手告别)
希望这有所帮助。就像我说的,您也可以使用UDP完成相同的工作。但是从经验来看,我真的不会进入TCP。

对于上述解决方案,在玩家发送“FindMatch” HTTP请求后,服务器将如何继续向客户端传递更新,例如“GotOne(我们找到了一个匹配)”?这不会通过HTTP响应完成,因为找到匹配可能需要几分钟。服务器是否应该与客户端保持套接字连接以发送这些更新,还是坚持纯HTTP轮询来自客户端的请求? - mbradber
不,客户端会在一定的时间间隔内继续调用FindMatch。如果找到匹配项,FindMatch的响应会告诉客户端,并相应地做出反应。 - Kelly Elton
每隔几秒钟就有数千个玩家通过HTTP请求轮询匹配服务器是一种被接受的做法吗?难道为他们打开一个套接字连接以便进行双向自由通信不更加高效吗? - mbradber
你完全可以用UDP做到我上面提到的事情,这并不需要一个开放的TCP连接。另外,如果你收到太多请求,就要减少一下。没有人说匹配必须在亚秒级别完成。5、10、15、60秒都是可以接受的。有些游戏需要几分钟才能匹配成功,而且实际上,除了网络方面,找到一个合适的对手可能需要更长的时间。 - Kelly Elton
我忘记了确切的措辞,但在这个阶段你不应该优化某些东西并可能使它比需要的更复杂,我猜你甚至可能不知道你将会收到多少人。 - Kelly Elton
1
还有最后一件事,如果你正确地进行抽象处理,当UDP和HTTP出现问题时,你应该能够轻松切换。(对于连续发送的消息,很抱歉,这是目前为止的最后一条) - Kelly Elton

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