【问题标题】:Optimum Update frequency for a client server based multiplayer game基于客户端服务器的多人游戏的最佳更新频率
【发布时间】:2010-10-18 14:47:47
【问题描述】:

我正在用 c++ 制作多人游戏:

客户端只需从用户那里获取命令,计算玩家的新位置并将其传达给服务器。服务器接受来自所有客户端的此类位置更新,并对每个客户端进行相同的广播。在这种情况下,哪些参数应该确定连续更新之间的时间间隔(我不想要太多更新,因此阻塞了 n/w)。我在想,客户端之间的最大 ping 应该是贡献参数之一。

其次,我如何确定客户端的这种 ping/延迟?该论坛上的其他主题建议使用“原始套接字”或使用系统的 ping 命令并从文件中收集输出.. 他们的意思是使用 system('ping "client ip add" > file') 之类的东西还是分叉和执行 ping 命令..

【问题讨论】:

  • 首先你的基本概念是有缺陷的。将命令发送到服务器,而不是位置。否则你最终会遇到比你想象的更多的骗子。其次,更新率取决于你的游戏类型,以我的github.com/BonsaiDen/NodeGame-Shooter 为例,50-300ms 就足够了。更新之间的时间跨度越大,您需要做的插值就越多。
  • Ivo,你说得对,如果我发送位置,欺骗客户的空间很大,但我认为,由于我使用 UDP 发送这些更新数据包,如果“位置”更新丢失在运输过程中,对游戏的损害不会像'commans'更新丢失那样严重,在这种情况下,我还必须定期与每个客户保持正确的位置同步......你是否也建议更新频率不应该是网络性能的函数(例如,如果网络负载很重/相对空闲)?
  • 如果你根据玩家的 ping 频率来确定频率,那么有人很容易通过增加他的 ping 来减慢整个游戏的速度。你做过一些测试吗? UDP是基本要求吗?非职位的东西呢?就像开火、施法、点击 UI 一样。你也想使用 UDP 吗?这样你最终会得到大量的客户端逻辑和大量疯狂的服务器端验证代码。
  • 我读到的每一个地方,他们都告诉我我必须使用 UDP 来发送更新数据包,因为它们会频繁且实时(丢失的数据包比延迟的数据包更好,对吗?)。尽管您已经提出了有关客户端可以处理的命令类型的可伸缩性的严重问题..(服务器检查变得越来越复杂)。那么解决方案是什么?仅将命令从客户端发送到服务器,然后还通过发送定期同步更新来保持 Universe 同步?
  • 发送命令是把事情做好的最简单的方法,把事情做好总是比让他们表现好要好。我不知道您的游戏规模,但我建议您首先使用 TCP。由于这似乎是您的第一个多人游戏项目,因此掌握保持世界安全和同步所需的概念更为重要。像《魔兽世界》这样的游戏会混合使用 TCP 和 UDP,但请记住,它们有 1000 倍的体验和 100 倍的人来编写服务器端和客户端检查(比如监视游戏过程的守望者)。

标签: c++ network-programming


【解决方案1】:

这个答案将取决于您所谈论的多人游戏类型。听起来你在谈论一个mmo类型的游戏。 如果是这种情况,那么使用“临时通道”是有意义的,这基本上意味着客户端每秒可以生成多个移动数据包,但只有最近的移动数据包被发送到服务器。如果您使用这样的技术,那么您应该根据玩家在游戏中移动的速度来确定更新率。通过这样做,您可以确保玩家不会滑过墙壁或过快地跑过触发器。

你的第二个问题我会使用 boost::asio 来设置一个服务,你的客户可以通过发送一个简单的数据包来“ping”,然后该服务会向客户端发送一条消息,你可以确定它花费的时间获取返回的数据包。

【讨论】:

  • 这个建议很有意义..但是在我的场景中这不会真正起作用..在我的游戏中,客户端发送其玩家的位置,服务器,也基于此进行一些计算位置和其他玩家的位置,以及场景中的其他对象。如果客户端只发送一些位置更新,那么服务器并不总是知道客户端的准确位置,因此可能会执行不正确的计算
  • @AnkurVj:客户端为什么会发送玩家的位置?这里有什么不寻常的要求吗?通常,客户端发送玩家命令,服务器确定位置等信息。否则,人们会入侵客户端或连接,让自己随时随地随心所欲。
  • @David Thornley:你说得对,玩家可以轻松破解他们的客户端,或者最轻松地进行速度破解之类的事情。 @AnkurVj:你可能会重新考虑你的设计,服务器确实需要成为玩家位置的最终权威。
  • @Kyle,David,绝对有效的观点,请参阅我的问题的 cmets
  • 顺便说一句,asio 的“计时器”功能对我有很大帮助,很好
【解决方案2】:

如果您最终要处理原始数据包,您不妨滚动自己的 ICMP 数据包;结构很简单 (http://en.wikipedia.org/wiki/Ping)。

【讨论】:

    【解决方案3】:

    enet 库为您做了很多网络工作。它也计算延迟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多