如何制作对等多人游戏?[关闭]


37

如何制作P2P多人游戏?我想要一个没有服务器的多人游戏。但是,所有的客户如何彼此认识呢?

为什么p2p协议在文件传输中如此有名,而在多人游戏中却没有?


在p2p游戏中可能非常有趣的是,设法制作一个适合MMO的网络代码,以实现更好的社交功能:只有拥有5个以上玩家的城市和政党才需要服务器。我不知道什么是可行的,什么是不可行的,但是目前,这是唯一比照片级逼真的图形更有趣的东西……
jokoon 2010年

但是p2p在多人游戏中非常受欢迎!谁说不是?甚至一些大型MMO都使用p2p
Adam Harte

Answers:


34

对等游戏通常仍具有游戏主机。它是将游戏发布到主游戏列表并接受新连接的游戏主机。每当游戏主机接受游戏的新客户端时,游戏主机就会将所有新客户端通知给所有现有客户端,以便他们可以确保它们连接到新客户端。

实现p2p的最简单方法是在大厅中。所有客户端都在大厅(或聊天室)中连接到主机。当主机准备就绪时,玩家按下开始键,它们都将同时进入游戏(通常用于策略游戏)。一种更复杂的方法是使用“插入式退出”,玩家可以在其中加入和退出游戏,但这在p2p游戏中实现起来要复杂得多,并且需要一种称为主机迁移的功能。

许多游戏都使用点对点网络,包括大多数策略,体育和驾驶游戏。几乎所有Xbox360和PS3游戏都使用p2p网络。客户端-服务器体系结构主要用于第一人称射击游戏或MMO游戏。

客户端-服务器通常更容易实现,因为只有一台机器不知道整个游戏状态,客户端基本上只是渲染器,需要进行一些预测才能使游戏看起来更流畅。

当您构建p2p引擎时,所有客户端都需要游戏世界的完整状态,并且都需要保持同步。

有关p2p和客户端-服务器体系结构的更多详细信息,建议您阅读以下文章:每个程序员都需要了解的游戏网络

而且,如果您不熟悉网络一般,请查看该站点上的其他精彩文章。Glenn是一位网络天才。


13

p2p在游戏中不受欢迎的原因有很多,主要是由于滞后。每个人都和最慢的球员一样慢。我们在这里不是在讨论带宽,而是在ping时间。

p2p可以传输大量数据,但是通过较高的ping操作可以做到,因此游戏需要以最少的ping时间传输非常少量的数据。


13

关于点对点系统和动作游戏,存在一些有趣的方面。我试图在Glenn Fiedler的博客上发表评论,但显然他不喜欢被证明是错误的,而是撤了整篇文章。如果您想阅读它,它在Internet存档上。

他没有让评论在线发表,所以我在这里引用它:

尽管有时有些天真,但第一篇文章中的对等建议实际上是一个有趣的起点:第一种可能性是将系统与标准的客户/服务器模型结合,并在您的文章中进行概述关于游戏网络。较低的P2P ping会大大减少玩家之间的预测滞后时间,具体取决于他们所在的位置:对于大多数美国游戏玩家来说,这种效果可能看不到,但是在欧洲,大多数服务器上ping 200+正常,因此直接连接会减少预测落后于欧洲服务器。

真正的没有服务器的P2P方法要复杂一些:分散网络的主要关注点是确保一致性,尤其是如果模拟由于网络上发送命令的时间稍有不同或浮点问题而可能遭受蝶形影响时。通过至少周期性地联网每个对象(玩家,NPC等)的状态,这是可能的。甚至没有必要一次对所有对象都这样做,并且每个客户端都可以拥有某些对象。在一定时间内将足够多的对象联网,应该减少对象的每次同步之间累积的差异,即使对于同步间隔为一秒或更长时间,它们之间的差异也变得无关紧要。

P2P系统的第二个问题是安全性,但是在这种情况下,可以通过较小的修复来解决:客户可以使用其物理模拟来收集有关每个物理对象上的错误级别的信息。操纵物理总是会导致更大的错误,因此客户端将只是“投票”以与控制可疑对象的对等方断开连接。另外,用于非物理对象的控制消息根据其重要性在客户端之间转发:播放器更新可以随机转发,重要且不经常的更新应始终发送,但仍发送给随机播放器。这样一来,玩家将必须控制大量的连接客户端,以便能够以任何明显的方式作弊。

[...]

您可以在http://www.devmaster.net/forums/showthread.php?t=14640上找到我引用的线程。

我认为有人在本文的一个主题中提到了点对点的防火墙问题。一个可能的解决方案是一个NAT穿通:
- NAT穿通概述
- 对等网络通信跨网络地址转换

没有100%的成功率,因此您应该告诉玩家打开端口。


+1的人只能回答这个问题,谢谢。一个问题:您提到状态膨胀失控时的蝴蝶效应差异(我已经看到这种情况发生在几本写得不好的Interplay游戏中)。当发现机器之间的状态不同时,我们该怎么办?以星际争霸为例,如果我的计算机认为一个单元死亡,而我的对手的计算机认为另一个单元死亡,该怎么办?我们如何确定该选择谁呢?
BlueRaja-Danny Pflughoeft

@BlueRaja Starcraft实际上不是一个很好的例子,因为它的引擎是100%确定性的。您只需要可靠地传递带有时间戳的播放器命令,共享同一程序的计算机将始终同意当前状态。减少差异的一种好方法是为每个状态的更新加上游戏时间的时间戳(物理帧或滴答声),并将其中一些帧缓存在接收机上。(到目前为止,大多数FPS游戏的示例都是CS:S和TF2。)此外,请勿将浮点数用于任何重要内容,因为它们的实现可能会有所不同。
2011年

如果引擎是100%确定性的(有物理学库对此提供保证),并且使用帧缓存在计算机之间同步状态,则蝶形效果将变为0。(只要可以保证可靠的连接即可。)优点是您可以相对容易地识别作弊客户,因为获得不同结果的唯一方法是拥有不同的代码。请注意,根据网络性能的不同,可能无法在游戏的每个方面都做到这一点。由于这个原因,碎片通常不同步。快速节奏的游戏通常无法同步所有内容。
2011年

由于此博客帖子此后已从Google的缓存中消失,因此它位于Internet存档上:web.archive.org/web/20091120214817/http
//gafferongames.com/…– fernozzle 2015年

9

像“星际争霸”这样的实时战略游戏就是“真正的对等”游戏的一个很好的例子。

在具有数百个单位/弹丸运动的游戏中,通过网络向所有其他玩家重复发送单位位置/状态是不切实际的,因此这里的一种解决方案是让所有玩家同步运行(完全相同)模拟。

当一个玩家执行一个动作时,命令/命令(“将角色移动到X,Y”)可以发送给所有其他玩家,以便所有模拟实例在不到一秒钟的时间内执行。

在这种情况下,如果有任何玩家断开连接,则游戏可以继续进行-由于不需要服务器/主机来运行游戏,其余玩家可以继续游戏。

但是,保持游戏同步并非易事,您必须使用固定的时间步进行游戏逻辑更新,并且在使用和播种随机数生成器时必须非常小心,以确保模拟不会发散!


5

当大多数实时策略游戏(《星际争霸》系列,《命令与征服》系列)和许多FPS游戏(《使命召唤:现代战争2》)使用它时,声称它在游戏中并不著名可能是不诚实的。

也就是说,您如何学习或掌握游戏取决于您使用或创建的配对/游说服务。但是,即使一个人了解了游戏,仍然可能会有一个或多个同龄人比其他人更加平等。考虑3个希望玩游戏的客户的情况,一个在开放式nat之后,两个在严格(封闭)nat之后。开放的nat对等方可以与其他两个进行连接。但是2严格不能彼此直接连接,它们将需要开放的nat来中继数据包。如果开放的同peer退出游戏,那么将需要找到另一个中继,否则游戏将被破坏。


2

您可能还需要查看Badumna(www.badumna.com),该网站声称是在线游戏的对等网络解决方案。它似乎以分布式方式进行游戏状态同步,并且根据他们的网站提供Flash版本。


1

您可能希望与一位玩家(我们将他/她称为“主机”)一起作为非权威服务器运行。您将让所有其他玩家与我们的主机交流自己在做什么,主机将把消息转发给其他玩家。

您可能还希望传递与主机播放器连接的计算机列表,以便在计算机掉线时可以选择新主机并开始与其余播放器进行通信。

smartfoxserver的文档可能会为您提供帮助,并且/或者您可能最终也希望在游戏中使用它。您只需将其嵌入到客户端游戏中,而不用拥有单独的客户端和服务器程序。


1
这似乎少了点对点设置,而更多的是即兴服务器/客户端。
deft_code

@caspin这是大多数(如果不是全部)p2p游戏都运行的游戏。一名玩家被指定为主机,其他人与他连接。
AttackingHobo 2010年

2
@Hobo:这是不是 P2P,即客户端/服务器,无论你怎么称呼它。
o0'。

1

我对此事有点兴趣。您说的是制作游戏p2p而不是传统的客户端-服务器模型存在很多问题。但是我很确定p2p就像客户端服务器一样,但是每个对等方都有机会成为服务器。关于LAG如果您将一台计算机添加为服务器,则有更多的可能性使许多客户端离服务器更远,但是使用p2p时,大厅中没有多余的计算机,您可以管理延迟测试并以最小的ping来创建组。关于流量的产生,据我了解,您必须要求客户端传输的流量小于或等于少。


xbox 360上的gta4是p2p,因此它是可能的,几乎没有滞后

-1

如果您要制作的系统要求较低的mmorpg相对简单,我建议您创建一个内部程序,该程序根据游戏文件夹的内容以及文件的组成来创建“频率”。这将使具有相同“频率”的人在相同频道上播放。调制,操纵或普通客户端将被分离。这仅适用于本机hack或mod,但是我敢肯定,这涵盖了所有“愚蠢”的作弊者。结合一个人提到的错误检查方法,几乎​​不需要或不需要进行审核。就端口而言,只需使用后台进程覆盖端口52225,即可使其在没有触发端口的情况下插入路由器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.