实施实时多人游戏有哪些问题

时间:2008-09-18 06:05:14

标签: sockets networking tcp udp multiplayer

我有使用套接字制作多人回合制游戏的经验,但我从未尝试过实时动作游戏。我需要处理哪些额外的问题?我是否需要保留玩家行为的历史,以防滞后的玩家在过去做些什么?我真的需要使用UDP数据包还是TCP足够?还有什么?

我还没有真正决定要做什么,但为了这个问题,你可以考虑使用X Y机芯的10人2D游戏。

5 个答案:

答案 0 :(得分:20)

  • '客户端服务器'或“点对点”或介于两者之间的东西:哪台计算机具有哪些游戏操作的权限。

对于基于回合制的游戏,通常很容易说'服务器具有最终权限而且我们已经完成'。对于实时游戏,通常这种设计是一个很好的起点,但是一旦你增加了延迟,客户端的动作/动作就会没有反应。因此,您添加某种“延迟隐藏”,允许客户端输入立即影响其角色或单位来解决该问题,现在您必须处理客户端和服务器游戏状态开始分歧时的协调问题。 9次outta 10就好了,你弹出或者将客户端影响到的对象弹出到权威位置,但是10次中的1次是当对象是玩家头像或其他东西时,该解决方案是不可接受的,所以你开始给予客户一些行动的权力。现在你必须协调服务器上的多个游戏状态,并通过恶意客户端打开你自己的“作弊”,如果你关心那种事情的话。这基本上是每个传送/欺骗/任何错误/欺骗出现的地方。

当然,你可以从一个模型开始,'每个客户都拥有对'他们'对象'的权限,而忽略了作弊问题(在很多情况下很好)。但是现在你很容易受到游戏模拟的巨大影响,如果那个客户退出,或者“只是落后于跟上模拟” - 实际上每个玩家游戏最终会感受到/感受到滞后或以其他方式表现不佳的客户,其形式是等待滞后的客户赶上,或让他们控制的游戏状态不同步。

  • 'synchronized'或'asynchronus'

确保所有玩家在同一游戏状态下运行的常见策略是简单地同意玩家输入列表(通过上述模型之一),然后让游戏模拟在所有机器上同步播放。这意味着模拟逻辑必须完全匹配,否则游戏将不同步。这实际上比听起来更容易也更难。它更容易,因为游戏只是代码,并且当它提供相同的输入(甚至是随机数生成器)时,代码几乎完全相同。这更难,因为有两种情况并非如此:(1)当你意外地在游戏模拟之外使用随机游戏时(2)当你使用花车时。前者通过对什么游戏系统使用RNG的严格规则/断言进行纠正。后者通过不使用浮子来解决。 (浮动实际上有两个问题,一个根据项目的优化配置,它们的工作方式非常不同,但即使这个问题得到解决,它们在不同的处理器体系结构中运行也不一致,大声笑)。星际争霸/魔兽争霸以及任何提供'重播'的游戏最有可能使用这种模式。事实上,拥有重播系统是测试您的RNG保持同步的好方法。

使用异步解决方案,游戏状态机构只需以某种频率将整个状态广播到所有其他客户端。客户端获取数据并将其抨击到他们的游戏状态(并且通常会做一些简单的推断,直到他们获得下一次更新)。这里'udp'成为一个可行的选择,因为你每隔约1秒左右就会在整个游戏状态发送垃圾邮件,丢掉这些更新的一部分是无关紧要的。对于游戏状态相对较少的游戏(地震,魔兽世界),这通常是最简单的解决方案。

答案 1 :(得分:6)

设置多人游戏涉及一些因素

  1. 协议,您决定是要TCP还是UDP非常重要。 UDP具有较少的开销,但不能保证交付。相反,TCP更值得信赖。每个游戏都有自己喜欢的协议。例如,UDP适用于第一人称射击游戏,但可能不适合信息需要保持一致的RTS

  2. 防火墙/连接。确保您的多人游戏不必进行2000出站连接并使用标准端口,因此轻松实现端口转发。将它与Windows防火墙连接可能是一个额外的好处。

  3. 带宽。这很重要,您打算通过网络连接传输多少数据?我想这将归结为测试和记录吞吐量。如果您要求每个客户端超过200kb / s,您可能需要重新考虑一些事情。

  4. 服务器负载。这一点也很重要,服务器需要对正常游戏进行多少处理?你需要一些超级8核心服务器和16GB的RAM来运行吗?有减少它的方法吗?

  5. 我想有更多,但你真的想要一个通过网络和各种连接玩游戏的游戏。

答案 2 :(得分:6)

规划是你最好的朋友。找出你真正需要的是什么。

加载数据:每台计算机是否都具有相同的型号和图形,并且只通过网络移动名称和位置。如果每个玩家都可以自定义角色或其他物品,则必须移动此数据。

作弊:你要担心吗?你能相信每个客户说的话吗?如果没有,那么服务器端逻辑将与客户端逻辑看起来不同。想象一下这个简单的情况,你的10名玩家中的每一个都可能因为加电而具有不同的移动速度。为了最大限度地减少作弊,您应该计算每个玩家在服务器之间的通信更新之间移动的距离,否则玩家可能会加速攻击,没有任何东西可以阻止他们。如果玩家总是比预期快一点或者有一次跳跃,那么服务器只会将它们重新定位在可能的最近位置,因为它可能是时钟偏差或通信中断一次。然而,如果玩家尽可能地不断移动两次,那么将他们踢出游戏可能是谨慎的。数学越多,你可以在服务器上仔细检查的游戏状态越多,游戏就会越一致,顺便说一下这会让作弊更难。

如何点对点:即使游戏是点对点你也可能想让一个玩家开始游戏并将它们用作服务器,这比试图管理一些游戏更容易更多基于云的方法。如果没有服务器,则需要使用协议来解决具有不一致游戏状态的2台机器之间的争议。

再次规划是您最好的朋友计划,计划,计划。如果你仔细考虑一个问题,你可以考虑解决大多数问题。然后你就可以开始思考那些你尚未解决的问题。

答案 3 :(得分:4)

避免作弊有多重要? [您能信任来自客户的任何信息,还是可以信任和认证?]

对象模型 对象如何从一台机器传递到另一台机器?如何对某个对象进行操作?

您在做客户端/服务器还是点对点?

随机数 如果你做对等,那么你需要保持锁定步进和随机数同步。

如果您正在做客户端/服务器,您如何处理滞后? [航位推算?]

网络编码涉及很多非平凡的问题。

查看RakNet,它可以免费下载代码及其讨论组。

答案 4 :(得分:0)

如果您在局域网上运行,TCP就可以了。但是如果你想在线玩游戏,你必须使用UDP并实现自己的类TCP层:必须通过抛出NAT路由器。

您需要在点对点或客户端 - 服务器通信之间进行选择。在客户端 - 服务器模型中,同步和世界状态更容易实现,但您可能在线缺乏反应性。在Pee-to-peer中,它更复杂,但对玩家来说更快。

不要为了游戏目的保留玩家行动的历史(这样做,但仅限于重播功能)。如果你达到了必要的程度,那就选择让每个玩家等待。