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

我还没有真正决定要制作什么,但出于这个问题的目的,您可以考虑一款具有 X Y 运动的 10 人 2D 游戏。

有帮助吗?

解决方案

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

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

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

  • “同步”或“异步”

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

通过异步解决方案,游戏状态当局只需以某种频率向所有其他客户端广播整个状态。客户端获取这些数据并将其输入到他们的游戏状态中(通常会进行一些简单的推断,直到他们获得下一次更新)。这就是“udp”成为一个可行的选择的地方,因为你每隔约 1 秒左右就会向整个游戏状态发送垃圾邮件,丢弃这些更新的一部分是无关紧要的。对于游戏状态相对较少的游戏(《地震》、《魔兽世界》),这通常是最简单的解决方案。

其他提示

设置多人游戏涉及几个因素

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

  2. 防火墙/连接。确保您的多人游戏不必建立 2000 个出站连接并使用标准端口,以便轻松进行端口转发。将其与 Windows 防火墙连接可能会带来额外的好处。

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

  4. 服务器负载。这也很重要,一个正常的游戏需要服务器进行多少处理?您是否需要具有 16GB RAM 的超 8 核服务器来运行它?有办法减少吗?

我想还有更多,但您确实想要一款可以通过网络和各种连接舒适地玩的游戏。

计划是你最好的朋友。弄清楚你的真正需求是什么。

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

作弊:你需要担心吗?你能相信每个客户所说的话吗?如果没有,那么您的服务器端逻辑将看起来与客户端逻辑不同。想象一下这个简单的情况,您的 10 名玩家中的每一位都可能因为能力提升而具有不同的移动速度。为了最大限度地减少作弊行为,您应该计算每个玩家在来自服务器的通信更新之间可以移动多远,否则玩家可能会在那里加速,没有什么可以阻止他们。如果玩家持续比预期快一点或有一次跳跃,服务器只会将他们重新定位到可能的最近位置,因为这可能是时钟偏差或通信中的一次性中断。然而,如果玩家不断地移动两倍的距离,那么将他们踢出游戏可能是明智的做法。数学越多,您可以在服务器上仔细检查的游戏状态部分越多,游戏就越一致,顺便说一句,这将使作弊变得更加困难。

点对点的情况如何:即使游戏是对等的,您也可能希望让一个玩家开始游戏并将其用作服务器,这比尝试管理一些基于云的方法要容易得多。如果没有服务器,那么您需要制定一个协议来解决游戏状态不一致的两台机器之间的争议。

再说一遍,计划是你最好的朋友计划、计划、计划。如果你对一个问题思考得足够多,你就能想出解决大部分问题的方法。然后你就可以开始思考那些你还没有解决的问题了。

避免作弊有多重要?[您可以信任来自客户的任何信息吗?或者它们可以被信任和验证吗?]

对象模型对象如何从一台机器传送到另一台机器?如何对对象执行操作?

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

随机数如果您进行点对点,那么您需要保持它们同步并且随机数同步。

如果你正在做客户端/服务器,你如何处理延迟?[航位推算?]

网络编码涉及许多重要问题。

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

如果您在 LAN 上运行,TCP 就可以了。但如果你想在线玩,你必须使用UDP并实现你自己的类似TCP的层:需要通过路由器进行NAT转换。

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

不要出于游戏目的保留玩家操作的历史记录(这样做,但仅用于重播功能)。如果你达到了必要的程度,最好让每个玩家都等待。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top