与往常一样,您想要做的事情有几个选择是可以接受的。
使用 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 环境中使用图表进行通信可能会更有效率,但肯定需要远远超过几分钟的时间来解释。
我给了你我对这些技术的看法,如果你想保持简单,请使用经典的客户端-服务器架构,给你需要处理的负载,这将是可以接受的。
享受 ;)