目前,我正在考虑使用P2P创建网络游戏。游戏的节奏不太快,我无法使用专用服务器,因此对我来说P2P似乎是一个不错的选择。我确实可以访问在线域。编程是用C++完成的。

忽略了游戏网络的危险,我认为P2P不需要任何类型的集中式服务器通信。然后我想:“但究竟我怎么能找到其他不知道自己IP的游戏用户呢?”。我现在的想法是,我需要某种中央“集线器”,游戏可以连接到该中央“集线器”,以获取可用对等主机及其IP和端口的列表。然后它将连接到该主机并使用UDP发送数据(我知道它是无连接的,但是ENet似乎有一些技巧)。如果我的想法完全荒唐,请告诉我。

我的想法是在我的在线域上制作一个非常简单的PHP客户端-IP-switch-thingy。我认为游戏不会吸引超过2到3个人,因为这只是出于我个人的学习目标,因此该 Realm 的负担不会太大。问题是我真的找不到使用PHP进行任何形式的可用信息。我试图浏览SO的“类似问题”,但仍然找不到很多信息。

我想问的是:如果可能的话,如何创建PHP游戏客户端/主机跟踪器?您知道与此相关的任何优秀网站或文章吗?

附带说明一下,我希望将ENet和SFML结合使用,ENet用于可靠的UDP数据包,而SFML用于数据包构建器。那是一个可行的选择吗?

最佳答案

与往常一样,您可以选择几种选择。

使用P2P连接非常棘手,但功能强大,尤其是在诸如VOIP和多人在线游戏等低延迟 Realm 中。

我认为您需要公开一个服务器,该服务器将处理与所连接播放器有关的信息和状态。我建议为这部分使用C++并为网络使用 boost::asio ,因为您会发现使用这两者的很多很好解释的示例,而且您可能会发现它们非常健壮和可扩展。但这最终要取决于您。

该组件的作用是接受想要加入或创建游戏的游戏玩家的传入连接。它将保存当前连接的游戏和用户列表,并使新来的玩家可以使用它们。

很简单,不是吗?现在是您必须选择的游戏架构。这里的选择是使用播放器之间的P2P连接,或将服务器用作每个播放器之间的代理。

服务器作为代理

持有有关每个游戏和玩家信息的服务器可用于转发玩家之间的连接。就可伸缩性和性能而言,这是相当低效的,因为您正在创建服务器的单点故障,但是由于对此域的要求较低,因此可以选择。

在这种情况下,当玩家想要加入游戏时,服务器可以接受新的连接(例如,在另一个套接字上),并向所有其他玩家广播消息,这样,当另一个玩家加入,移动,芽...

对等连接

有点棘手。服务器将始终用于了解当前存在哪些玩家和游戏,但与其负责管理用户本身之间的联系,不如说它只是告诉想要加入游戏的玩家“嘿,你是即将加入新游戏,如果您愿意,请联系“10.20.30.40”。那就是“托管”游戏的那个人的公共(public) IP地址。

然后,您将遇到第一个大困难。如果该主机在路由器后面,您将如何与之通信?您需要在客户端实现NAT穿越功能,以允许传入的玩家进入在其路由器之间托管游戏的计算机。

当VOIP应用程序使用 UPnP's IGD (Internet Gateway Device) 请求路由器打开并将某些端口重定向到所需计算机时,VOIP应用程序会使用某些技术来解决此问题(请考虑Skype)。这很棘手,因为它需要时间,并且未在每个路由器上都实现,因此有可能导致完全故障。就本示例而言,假设我们可以轻松克服此问题,然后转到下一个问题。

当连接到计算的托管游戏时,您可以问他还有哪些其他玩家也连接到了该游戏,并广告您当前连接的其他玩家。
这里的想法是让比赛中的每个玩家彼此谈论更新(同样,这是 Action ,射击,私有(private)消息或其他内容),以使每个玩家保持同步(并相信我不会) 。您可能还希望实现一种排序数据包算法(最好使用UDP或ENet),在该算法中,您将定义如何将广告和消息广播到其他播放器。

例如,有一个比赛,其中有4位玩家与之相连。在此示例中,有一个邻居 Bob Alice ,他的邻居, Tom (住在纽约的一个人)和 Mike

爱丽丝首先连接到鲍勃的游戏,她告知鲍勃她加入了他的游戏,鲍勃和爱丽丝在每次更新时都在交换有关比赛当前状态的信息。现在,汤姆进来,告诉鲍勃他是新玩家,鲍勃告诉汤姆还有一个其他玩家已连接,并给他提供了她的IP地址(爱丽丝的)。现在,鲍勃告诉爱丽丝,某人已连接,并给了他IP地址。想象一下鲍勃死了,鲍勃会告诉爱丽丝死了,因为汤姆踢进来之前他是习惯于和她说话的,现在是爱丽丝才需要告诉汤姆鲍勃死了。

您可以简单地让所有玩家向每个玩家广播每个广告,但这将是相当大量的数据要处理,而且鉴于一场比赛中的玩家数量,这种数据的可伸缩性也不那么好。在P2P环境中使用图形进行通信可能会更加高效,但肯定会花费不仅仅几分钟的时间。

我给了我关于这些技术的观点,如果您想保持简单,请使用经典的客户端-服务器体系结构,并提供需要处理的负载,这将是可以接受的。

请享用 ;)

关于php - 创建PHP P2P游戏客户端跟踪器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16345506/

10-10 14:06
查看更多