我正在寻找特定于游戏的网络设计和技巧。我知道一些问题,并且我对其中一些问题有一些部分解决方案,但可能还有一些我看不到的问题。我认为对此没有明确的答案,但我会接受我真正喜欢的答案。我可以想到 4 类问题。
信号不好
客户端发送的消息需要一些时间才能到达服务器。服务器不能只处理它们 FCFS,因为这对延迟较高的玩家不公平。对此的部分解决方案是消息上的时间戳,但您需要两件事:
- 能够信任客户的时钟。(我认为这是不可能的。)
- 您可以测量的恒定延迟。你能对可变延迟做些什么?
许多游戏使用 UDP,这意味着消息可能会丢失。在这种情况下,他们会尝试根据他们已有的信息来估计游戏状态。在连接再次工作后,您如何知道估计的状态是否正确?
在 MMO 游戏中,服务器处理大量客户端。分配负载的最佳方式是什么?基于游戏中的位置?将一组客户端绑定到服务器?你能避免通过服务器发送所有内容吗?
球员离开
发生这种情况时,我已经看到了 2 种不同的行为。在大多数 FPS 游戏中,如果主持游戏的玩家(我猜他是服务器)离开其他人无法玩。在大多数 RTS 游戏中,如果任何玩家离开,其他玩家可以在没有他的情况下继续玩。没有专用服务器怎么可能?大家都知道完整的状态吗?他们是否以某种方式转移了服务器的角色?
获取信息
下一个问题可以通过专用服务器解决,但我很好奇它是否可以在没有服务器的情况下完成。在很多游戏中,玩家不应该知道游戏的完整状态。RTS 中的战争迷雾和 FPS 中的墙壁就是很好的例子。但是,他们需要知道一个动作是否有效。(例如,你能从那里射我还是你在地图的另一边。)在这种情况下,客户端需要验证对未知状态的更改。这听起来像是可以通过巧妙地使用密码原语来解决的问题。有任何想法吗?
作弊
在受信任的客户端环境中,上述一些问题很容易发生,但不能假设。是否有适用于例如 80% 普通用户 - 20% 作弊者环境的解决方案?你真的可以制作一个可以工作的反作弊软件(并且不需要像内核模块这样荒谬的东西)吗?
我确实阅读了这个问题和一些答案https://stackoverflow.com/questions/901592/best-game-network-programming-articles-and-books但其他答案链接到不可用/受限内容。这是一个独立于平台/操作系统的问题,但也欢迎针对特定平台/操作系统的解决方案。