如何制作P2P多人游戏?我想要一个没有服务器的多人游戏。但是,所有的客户如何彼此认识呢?
为什么p2p协议在文件传输中如此有名,而在多人游戏中却没有?
如何制作P2P多人游戏?我想要一个没有服务器的多人游戏。但是,所有的客户如何彼此认识呢?
为什么p2p协议在文件传输中如此有名,而在多人游戏中却没有?
Answers:
对等游戏通常仍具有游戏主机。它是将游戏发布到主游戏列表并接受新连接的游戏主机。每当游戏主机接受游戏的新客户端时,游戏主机就会将所有新客户端通知给所有现有客户端,以便他们可以确保它们连接到新客户端。
实现p2p的最简单方法是在大厅中。所有客户端都在大厅(或聊天室)中连接到主机。当主机准备就绪时,玩家按下开始键,它们都将同时进入游戏(通常用于策略游戏)。一种更复杂的方法是使用“插入式退出”,玩家可以在其中加入和退出游戏,但这在p2p游戏中实现起来要复杂得多,并且需要一种称为主机迁移的功能。
许多游戏都使用点对点网络,包括大多数策略,体育和驾驶游戏。几乎所有Xbox360和PS3游戏都使用p2p网络。客户端-服务器体系结构主要用于第一人称射击游戏或MMO游戏。
客户端-服务器通常更容易实现,因为只有一台机器不知道整个游戏状态,客户端基本上只是渲染器,需要进行一些预测才能使游戏看起来更流畅。
当您构建p2p引擎时,所有客户端都需要游戏世界的完整状态,并且都需要保持同步。
有关p2p和客户端-服务器体系结构的更多详细信息,建议您阅读以下文章:每个程序员都需要了解的游戏网络。
而且,如果您不熟悉网络一般,请查看该站点上的其他精彩文章。Glenn是一位网络天才。
关于点对点系统和动作游戏,存在一些有趣的方面。我试图在Glenn Fiedler的博客上发表评论,但显然他不喜欢被证明是错误的,而是撤了整篇文章。如果您想阅读它,它在Internet存档上。
他没有让评论在线发表,所以我在这里引用它:
尽管有时有些天真,但第一篇文章中的对等建议实际上是一个有趣的起点:第一种可能性是将系统与标准的客户/服务器模型结合,并在您的文章中进行概述关于游戏网络。较低的P2P ping会大大减少玩家之间的预测滞后时间,具体取决于他们所在的位置:对于大多数美国游戏玩家来说,这种效果可能看不到,但是在欧洲,大多数服务器上ping 200+正常,因此直接连接会减少预测落后于欧洲服务器。
真正的没有服务器的P2P方法要复杂一些:分散网络的主要关注点是确保一致性,尤其是如果模拟由于网络上发送命令的时间稍有不同或浮点问题而可能遭受蝶形影响时。通过至少周期性地联网每个对象(玩家,NPC等)的状态,这是可能的。甚至没有必要一次对所有对象都这样做,并且每个客户端都可以拥有某些对象。在一定时间内将足够多的对象联网,应该减少对象的每次同步之间累积的差异,即使对于同步间隔为一秒或更长时间,它们之间的差异也变得无关紧要。
P2P系统的第二个问题是安全性,但是在这种情况下,可以通过较小的修复来解决:客户可以使用其物理模拟来收集有关每个物理对象上的错误级别的信息。操纵物理总是会导致更大的错误,因此客户端将只是“投票”以与控制可疑对象的对等方断开连接。另外,用于非物理对象的控制消息根据其重要性在客户端之间转发:播放器更新可以随机转发,重要且不经常的更新应始终发送,但仍发送给随机播放器。这样一来,玩家将必须控制大量的连接客户端,以便能够以任何明显的方式作弊。
[...]
您可以在http://www.devmaster.net/forums/showthread.php?t=14640上找到我引用的线程。
我认为有人在本文的一个主题中提到了点对点的防火墙问题。一个可能的解决方案是一个NAT穿通:
- NAT穿通概述
- 对等网络通信跨网络地址转换
没有100%的成功率,因此您应该告诉玩家打开端口。
像“星际争霸”这样的实时战略游戏就是“真正的对等”游戏的一个很好的例子。
在具有数百个单位/弹丸运动的游戏中,通过网络向所有其他玩家重复发送单位位置/状态是不切实际的,因此这里的一种解决方案是让所有玩家同步运行(完全相同)模拟。
当一个玩家执行一个动作时,命令/命令(“将角色移动到X,Y”)可以发送给所有其他玩家,以便所有模拟实例在不到一秒钟的时间内执行。
在这种情况下,如果有任何玩家断开连接,则游戏可以继续进行-由于不需要服务器/主机来运行游戏,其余玩家可以继续游戏。
但是,保持游戏同步并非易事,您必须使用固定的时间步进行游戏逻辑更新,并且在使用和播种随机数生成器时必须非常小心,以确保模拟不会发散!
您可能希望与一位玩家(我们将他/她称为“主机”)一起作为非权威服务器运行。您将让所有其他玩家与我们的主机交流自己在做什么,主机将把消息转发给其他玩家。
您可能还希望传递与主机播放器连接的计算机列表,以便在计算机掉线时可以选择新主机并开始与其余播放器进行通信。
smartfoxserver的文档可能会为您提供帮助,并且/或者您可能最终也希望在游戏中使用它。您只需将其嵌入到客户端游戏中,而不用拥有单独的客户端和服务器程序。