创建PHP P2P游戏客户端跟踪器



目前我正在考虑使用P2P创造一款网络游戏。这款游戏的节奏并不快,我也没有专用服务器,所以P2P对我来说是个不错的选择。我有一个在线域名。编程是用c++完成的。

我认为P2P不需要任何形式的集中式服务器通信。然后我想,‘但我怎么能找到其他不知道IP的游戏用户来托管游戏呢?’我现在的想法是,我需要某种中央"集线器",游戏可以连接到这个"集线器"上,从而获得带有IP和端口的可用对等主机列表。然后它将连接到该主机并使用UDP发送数据(我知道它是无连接的,但似乎ENet有一些技巧)。如果我的想法完全荒谬,请告诉我。

我想在我的在线域上做一个非常简单的PHP客户端- ip开关之类的东西。这款游戏吸引的人数不会超过2到3人,因为这只是我的个人学习目标,所以我认为该领域的负载不会成为太大问题。问题是,我真的找不到任何有用的信息,使任何使用PHP。我试着看一下SO的"类似问题",但我仍然找不到很多信息。

我的问题是:我如何创建一个PHP游戏客户端/主机跟踪器,如果可能的话?你知道这方面有什么好的网站或文章吗?

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

与往常一样,对于您想要做的事情,有几种选择是可以接受的。

使用P2P连接是棘手的,但可以是强大的,特别是在低延迟领域,如VOIP和多人在线游戏。

我认为你需要公开一个服务器来处理与连接的玩家相关的信息和状态。我建议在本部分使用C++,在网络部分使用boost::asio,因为您将找到大量使用这两个的示例,并且您可能会发现它们非常健壮且可扩展。但这是最终的决定,完全取决于你。

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

很简单,不是吗?现在你必须对游戏架构做出选择。这里的选择是在玩家之间使用P2P连接,或者使用您的服务器作为每个玩家之间的代理。

服务器作为代理

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

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

点对点连接

这有点棘手。服务器将始终服务于了解当前存在的玩家和游戏,而不是负责管理用户本身之间的连接,它可以简单地告诉想要加入游戏的玩家"嘿,你即将加入一个新游戏,如果你愿意,请联系10.20.30.40"。这将是"托管"游戏的家伙的公共 IP地址。

你会遇到第一个大的困难。如果主机在路由器后面,你怎么和他通信?您需要在客户端实现nat遍历功能,以允许传入的玩家在其路由器之间访问托管游戏的计算机。

VOIP应用程序使用一些技术来解决这个问题(想想Skype),当他们使用UPnP's IGD (Internet Gateway Device)要求路由器打开并重定向一些端口到想要的计算机。这很棘手,因为它需要时间,并且不是在每个路由器上实现的,所以这可能会导致完全失败。为了这个例子,假设我们可以很容易地克服这个问题,让我们进入下一个问题。

当连接到托管游戏的计算机时,您可以询问他还有哪些其他玩家也连接到游戏,并通知其他玩家您当前正在连接。这里的理念是让比赛中的每个玩家相互交流更新内容(游戏邦注:也就是移动、射击、私人信息等),以便让每个玩家保持同步(相信我,这是不可能的)。你可能还想实现一个排序数据包算法(最好使用UDP或ENet),在其中你将定义广告和消息如何广播到其他播放器。

以一场比赛为例,其中4名球员被连接。是主人BobAlice是他的邻居,Tom是一个住在纽约的人,Mike是我们在这个例子中需要的另一个人。

Alice首先连接到Bob的游戏,她告诉Bob她加入了他的游戏,在每次更新中Bob和Alice都在交换有关当前比赛状态的信息。现在Tom进来并告诉Bob他是一个新玩家,Bob告诉Tom有另外一个玩家正在连接,并给了他自己的IP地址(Alice的)。现在Bob告诉Alice有人连接上了,并给了她他的IP地址。假设Bob死了,Bob会告诉Alice他死了,因为在Tom介入之前,他已经习惯了和她说话,现在是Alice需要告诉Tom Bob刚刚死了。

你可以简单地让所有玩家向每个玩家广播每个广告,但这将是相当大的数据量来处理,并且考虑到比赛中的玩家数量不那么可扩展。在P2P环境中使用进行通信可能会更有效,但肯定要花几分钟的时间来解释。

我给了你我对这些技术的看法,如果你想保持简单,使用经典的客户机-服务器架构,考虑到你需要处理的负载,它将是可接受的。

享受;)

最新更新