1

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

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

我的想法是在我的在线域上制作一个非常简单的 PHP 客户端-IP-switch-thingy。游戏不会吸引超过 2 到 3 人,因为它只是为了我的个人学习目标,所以我认为该领域的负载不会成为太大的问题。问题是我真的找不到任何关于使用 PHP 制作任何东西的有用信息。我试图浏览SO的“类似问题”,但我仍然找不到很多信息。

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

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

4

1 回答 1

2

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

使用 P2P 连接很棘手,但功能强大,尤其是在 VOIP 和多人在线游戏等低延迟领域。

我认为您将需要公开一个服务器来处理与连接的玩家相关的信息和状态。我建议C++在这部分和boost::asio网络中使用,因为你会发现很多使用这两个的很好解释的例子,你可能会发现它们非常健壮和可扩展。但这最终取决于您。

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

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

服务器作为代理

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

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

对等连接

这有点棘手。服务器将始终用于了解当前存在哪些玩家和游戏,但它不负责管理用户本身之间的连接,它可以简单地告诉想要加入游戏的玩家“嘿,你是即将加入新游戏,如需,请联系10.20.30.40“. 那将是“托管”游戏的人的公共IP 地址。

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

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

当连接到游戏主机时,您可以询问他还有哪些其他玩家也连接到游戏,并宣传您当前连接的其他玩家。这里的想法是让比赛中的每个玩家互相讨论更新(同样,这可能是移动、投篮、私人消息或其他任何东西),以使每个玩家保持同步(相信我他们不会) . 您可能还想实现一个排序数据包算法(最好使用 UDP 或 ENet),您将在其中定义如何将广告和消息广播给其他播放器。

以连接 4 名玩家的比赛为例。有主持人Bob,他的邻居Alice , Tom一个住在纽约的人,而Mike是我们在本示例中需要的另一个人。

爱丽丝首先连接到鲍勃的游戏,她向鲍勃宣传她加入了他的游戏,每次更新鲍勃和爱丽丝都在交换有关当前比赛状态的信息。现在汤姆进来告诉鲍勃他是一个新玩家,鲍勃告诉汤姆有另一个玩家连接并给了他她的 IP 地址(爱丽丝的)。现在 Bob 告诉 Alice 有人连接并给了她他的 IP 地址。想象鲍勃死了,鲍勃会告诉爱丽丝他死了,因为在汤姆介入之前,他习惯于首先与她交谈,而现在爱丽丝需要告诉汤姆鲍勃刚刚死了。

您可以简单地让所有球员向每个球员广播每个广告,但这将是一个相当庞大的数据量,并且考虑到一场比赛中的球员数量,它的可扩展性并不高。在 P2P 环境中使用图表进行通信可能会更有效率,但肯定需要远远超过几分钟的时间来解释。

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

享受 ;)

于 2013-05-02T20:12:36.470 回答