6

我正在寻找特定于游戏的网络设计和技巧。我知道一些问题,并且我对其中一些问题有一些部分解决方案,但可能还有一些我看不到的问题。我认为对此没有明确的答案,但我会接受我真正喜欢的答案。我可以想到 4 类问题。

信号不好

客户端发送的消息需要一些时间才能到达服务器。服务器不能只处理它们 FCFS,因为这对延迟较高的玩家不公平。对此的部分解决方案是消息上的时间戳,但您需要两件事:

  • 能够信任客户的时钟。(我认为这是不可能的。)
  • 您可以测量的恒定延迟。你能对可变延迟做些什么?

许多游戏使用 UDP,这意味着消息可能会丢失。在这种情况下,他们会尝试根据他们已有的信息来估计游戏状态。在连接再次工作后,您如何知道估计的状态是否正确?

在 MMO 游戏中,服务器处理大量客户端。分配负载的最佳方式是什么?基于游戏中的位置?将一组客户端绑定到服务器?你能避免通过服务器发送所有内容吗?

球员离开

发生这种情况时,我已经看到了 2 种不同的行为。在大多数 FPS 游戏中,如果主持游戏的玩家(我猜他是服务器)离开其他人无法玩。在大多数 RTS 游戏中,如果任何玩家离开,其他玩家可以在没有他的情况下继续玩。没有专用服务器怎么可能?大家都知道完整的状态吗?他们是否以某种方式转移了服务器的角色?

获取信息

下一个问题可以通过专用服务器解决,但我很好奇它是否可以在没有服务器的情况下完成。在很多游戏中,玩家不应该知道游戏的完整状态。RTS 中的战争迷雾和 FPS 中的墙壁就是很好的例子。但是,他们需要知道一个动作是否有效。(例如,你能从那里射我还是你在地图的另一边。)在这种情况下,客户端需要验证对未知状态的更改。这听起来像是可以通过巧妙地使用密码原语来解决的问题。有任何想法吗?

作弊

在受信任的客户端环境中,上述一些问题很容易发生,但不能假设。是否有适用于例如 80% 普通用户 - 20% 作弊者环境的解决方案?你真的可以制作一个可以工作的反作弊软件(并且不需要像内核模块这样荒谬的东西)吗?

我确实阅读了这个问题和一些答案https://stackoverflow.com/questions/901592/best-game-network-programming-articles-and-books但其他答案链接到不可用/受限内容。这是一个独立于平台/操作系统的问题,但也欢迎针对特定平台/操作系统的解决方案。

4

4 回答 4

2

认为密码学会解决这类问题是一个非常常见且非常糟糕的错误:客户端本身当然必须能够解密它,所以它完全没有意义。你没有增加安全性,你只是增加了默默无闻(这被破解)。

作弊太针对游戏了。有些游戏无法完全消除(FPS 中的瞄准机器人),有些游戏如果不搞砸就根本不可能(基于服务器的回合制游戏)。

一般来说,像这样的网络问题与预测密切相关,这是一个非常复杂的主题,在著名的 Valve 文章中对此进行了很好的解释。

于 2010-09-23T22:50:23.200 回答
2

服务器不能只处理它们 FCFS,因为这对延迟较高的玩家不公平。

是的,它可以。随着延迟的变化,试图准确猜测某人有多少延迟并不公平。

在这种情况下,他们会尝试根据他们已有的信息来估计游戏状态。在连接再次工作后,您如何知道估计的状态是否正确?

服务器根本不需要猜测——它知道状态。客户端只需要在连接断开时猜测 - 当它备份时,它将被发送新状态。

在 MMO 游戏中,服务器处理大量客户端。分配负载的最佳方式是什么?基于游戏中的位置?

没有“最好的方法”。然而,地理分​​区的效果相当好。

你能避免通过服务器发送所有内容吗?

仅适用于不受信任的通信,这些通信通常带宽太低以至于没有意义。

在大多数 RTS 游戏中,如果任何玩家离开,其他玩家可以在没有他的情况下继续玩。没有专用服务器怎么可能?大家都知道完整的状态吗?

许多 RTS 游戏在所有机器上同时保持完整状态。

在受信任的客户端环境中,上述一些问题很容易发生,但不能假设。

大多数向公众开放的游戏都需要假设一个 100% 的作弊环境。

于 2010-09-24T09:45:20.137 回答
2

信号不好

高延迟的玩家应该购买新的调制解调器。我不认为增加更多延迟是一个好主意,因为游戏中的一个人连接不好。或者,如果您的意思是微小的延迟差异,谁在乎?如果你拒绝 FCFS,你只会让事情变得更慢更复杂。

作弊:瞄准机器人和类似的

你真的能做出一个有效的反作弊软件吗?你不能。您无法知道他们是在运行您的程序还是其他与您的程序类似的程序。

作弊:获取信息

如果您与可以信任的专用服务器建立了安全连接,那么作弊(例如查看超出允许的状态)应该是不可能的。

在一些游戏中,密码学可以防止作弊。像扑克这样的纸牌游戏,每个玩家都有机会“洗牌”。维基百科上的详细信息:心理扑克

理论上,您可以使用 RTS 或 FPS 加密您的部分游戏状态。然后将其发送给每个人,并且仅发送允许他们查看的部分或允许他们查看的部分的解密密钥。但是,我怀疑在 2010 年我们能否实时做到这一点。

例如,如果我想验证您确实可能在位置 B。那么我需要知道您来自哪里以及何时到达那里。但如果你之前告诉过我,我知道一些我不被允许知道的事情。如果你事后告诉我,你可以告诉我任何你想让我相信的事情。你之前可以告诉我,加密,并在我需要验证时给我解密密钥。这意味着,您必须使用不同的加密密钥来加密您所做的每一步。哎哟。

如果您没有实施扑克网站,那么作弊无论如何都不会是您最大的问题。

于 2010-09-23T23:52:07.040 回答
1

由于很多人在移动设备上访问游戏,当玩家处于接收不良的区域或连接到慢速 wifi 连接时,可能会出现“网络不良”。因此,这不仅仅是人们在人口稀少地区连接的问题。对于移动客户端,“坏网络”可能会非常频繁地发生,而且通常非常难以诊断。

UDP 会导致数据包丢失,但即使是使用基于 TCP 和 HTTP 的游戏也可能会遇到问题,即客户端和服务器通信速度变慢,而数据包被验证已发送。对于数据包丢失的通信 UDP 补偿通常取决于数据包包含的内容。如果您正在谈论运动数据,通常如果没有收到数据包,服务器会插入先前的轨迹并进行位置更改。通常这是游戏自定义的处理方式,这就是为什么人们经常避免使用 UDP,除非他们的游戏类型需要它。通常为了处理高网络延迟,问题游戏会自动降低用户可用功能的数量,以便他们仍然可以与游戏互动,而不会导致用户被踢或体验太多损坏的功能。

最理想的情况是,您希望拥有像Loggly这样的日志记录工具,它可以帮助您找到与不良连接和延迟相关的错误,并在它们发生时向您显示客户端和服务器上的情况,这种可见性可以让您诊断用户遇到和开发的常见问题解决这些问题的策略。

玩家离开 现在大多数游戏都有专用服务器,所以这个问题基本上没有实际意义。但是,有时可以,服务器可以更改为另一个客户端。

作弊 很难预测玩家将如何作弊并创建一个没有人可以破解的防作弊系统。如今,许多作弊检测策略都是基于对日志记录和行为分析信息数据的启发式分析,以在异常发生时发现异常并将其标记以供审查。您绝对应该尽可能多地尝试防作弊,但您也确实需要一个能够发现人们正在利用的新缺陷的早期检测系统。

于 2014-08-30T00:43:11.550 回答