实时多人游戏的实现中会遇到哪些问题?

16

我有一些使用 sockets 制作多人 回合制 游戏的经验,但我从未尝试过实时动作游戏。我需要处理哪些额外问题?在玩家有延迟的情况下,我需要保存玩家的操作历史记录吗?我真的需要使用 UDP 数据包还是 TCP 就足够了?还有什么其他问题需要考虑?

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

5个回答

20
  • '客户端 - 服务器' 或 '点对点' 或两者之间:哪台计算机拥有哪些游戏操作的权威。

对于回合制游戏,通常很容易只需说“服务器具有终极权威性并完成”,就可以了。但对于实时游戏来说,设计的起点通常是不错的选择,但一旦添加延迟,客户端的移动/行为会感觉迟钝。因此,你需要添加某种形式的“延迟隐藏”来允许客户端的输入立即影响其角色或单位以解决该问题,现在您必须处理当客户端和服务器的游戏状态开始分歧时的协调问题。9次中会有8次随意弹出或插值客户端已经影响的对象到权威位置,但1次中如果该对象是玩家头像或其他重要对象,则此解决方案是不可接受的,因此您开始授予客户端对某些操作的权威性。现在,您必须在服务器上协调多个游戏状态,并可能遭受通过恶意客户端进行作弊的风险,如果您关心这种事情,则会遇到基本上每次传送/复制/任何bug/作弊问题。

当然,您可以开始采用“每个客户端都对其对象具有权威性”的模型,并忽略作弊问题(在很多情况下是可以的)。但现在,如果该客户端退出或“稍微落后于保持与模拟同步”的情况,您就会面临游戏模拟受到巨大影响的风险 - 事实上,每位玩家的游戏将受到等待滞后客户端追赶或者控制游戏状态不同步的影响。

  • '同步' 或 '异步'
一种确保所有玩家在同一游戏状态下运行的常见策略是简单地同意玩家输入列表(通过上述模型之一),然后在所有机器上同步播放游戏模拟。这意味着模拟逻辑必须完全匹配,否则游戏将不同步。实际上,这比听起来容易和困难都要容易和困难。它更容易,因为一个游戏只是一段代码,而且代码基本上在给定相同输入时执行得几乎完全相同(甚至是随机数生成器)。它更难,因为有两种情况不适用:(1) 当您在游戏模拟之外意外使用随机数时;(2) 当您使用浮点数时。前者通过对每个游戏系统使用什么RNG的严格规则/断言来纠正。后者通过不使用浮点数来解决。(浮点数实际上有两个问题,一是基于项目的优化配置,它们的工作方式非常不同,但即使解决了这个问题,它们也在不同的处理器架构中工作不一致)星际争霸/魔兽等任何提供“重放”的游戏很可能使用此模型。事实上,拥有一个回放系统是测试您的RNG是否保持同步的好方法。
使用异步解决方案,游戏状态机关只需以某种频率向所有其他客户端广播整个状态。客户端接收该数据并将其插入到他们的游戏状态中(通常进行一些简单的外推,直到获得下一个更新)。这就是“udp”成为可行选项的地方,因为您每隔约1秒就会发送整个游戏状态,删除其中一部分更新是无关紧要的。对于游戏状态相对较少的游戏(如quake,魔兽世界),这通常是最简单的解决方案。

7
计划是您最好的朋友。确定您真正需要的需求。
加载数据:每台电脑是否都将拥有相同的模型和图形,只是名称和位置被移动到网络上。如果每个玩家都可以自定义其角色或其他物品,则必须移动此数据。
作弊:你需要担心吗?您可以相信每个客户端所说的话吗?如果不能,则您的服务器端逻辑将与您的客户端逻辑不同。想象一下这种简单情况,由于能力提升,您的10个玩家中的每个玩家的移动速度可能都不同。为了最小化作弊,您应该计算每个玩家在与服务器的通信更新之间可以移动多远,否则玩家可能会加快速度而没有任何阻止他们的东西。如果一个玩家始终比预期快一点或者有一次跳跃,那么服务器就会将他们重新定位到最接近可能位置,因为很可能是时钟偏差或通信中断。但是,如果一个玩家一直移动两倍于可能的距离,那么将他们踢出游戏可能是明智的选择。数学越多,您可以在服务器上双重检查的游戏状态部分就越多,游戏就越一致,顺便说一句,这将使作弊更加困难。
使用对等网络:即使游戏将成为对等网络,您也可能希望让一个玩家开始游戏并将他们用作服务器,这比尝试管理某些更基于云的方法要容易得多。如果没有服务器,则需要制定协议来解决两个具有不一致游戏状态的机器之间的争端。
再次计划是您最好的朋友。计划,计划,计划。如果您足够考虑一个问题,您可以想办法解决大部分问题。然后您可以开始思考尚未解决的问题。

6

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

  1. 协议,你需要决定是使用TCP还是UDP。UDP的开销较小,但无法保证传输的可靠性。相反,TCP更加可靠。每个游戏都有其首选的协议。例如,第一人称射击游戏可以使用UDP,但可能不适合需要信息保持一致的RTS游戏。

  2. 防火墙/连接。确保你的多人游戏不需要进行2000个出站连接,并使用标准端口以便于端口转发。与Windows防火墙进行接口可能是一个额外的优势。

  3. 带宽。这很重要,你打算通过网络连接传输多少数据?我猜这将取决于游戏测试和记录吞吐量。如果你需要每个客户端超过200kb/s的速度,你可能需要重新考虑一些事情。

  4. 服务器负载。这也很重要,一个正常游戏所需的服务器处理量有多大?你需要一台拥有8核16GB内存的超级服务器来运行它吗?是否有减少服务器负载的方法?

我想还有很多其他因素,但实际上你想要的是一款能够在网络上和各种连接下舒适游玩的游戏。


我不同意第二点,对于服务器端,我完全不鼓励使用Windows。 - undefined

4
避免作弊的重要性有多大? [你能相信来自客户端的任何信息吗?他们可信并且经过身份验证吗?]
对象模型 如何在不同机器之间通信对象?如何对对象执行操作?
您是在进行客户端/服务器还是点对点通信?
随机数 如果您正在进行点对点通信,则需要保持它们同步并使随机数同步。
如果您正在进行客户端/服务器通信,如何处理延迟?[死区估算?]
网络编码涉及许多非平凡问题。
请查看RakNet,它的下载代码和讨论组都是免费的。

0

TCP在局域网上运行很好。但是如果您想玩在线游戏,必须使用UDP并实现自己的类似TCP的层:这是必须通过NAT路由器的。

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

不要为了游戏目的而保留玩家动作历史记录(做到这一点,但仅用于重播功能)。如果达到必要条件,请优先让每个玩家等待。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接