Language agnostic 《星际争霸》和《帝国时代》等实时战略游戏的协议看起来如何?

Language agnostic 《星际争霸》和《帝国时代》等实时战略游戏的协议看起来如何?,language-agnostic,protocols,real-time,Language Agnostic,Protocols,Real Time,我对这类游戏的协议(和游戏循环)是如何工作的感兴趣;任何建议或见解都将受到赞赏 我猜主循环会有一个世界状态,每秒会前进几个“滴答声”,但是玩家的命令是如何执行的呢?什么样的数据需要来回传输?查看Wesnoth的战斗 它是免费的,开源的,而且非常棒。你可以从挖掘其来源中学到很多。帝国时代网络架构讨论 IMHO,这种基于点对点复制重放的体系结构给人留下了深刻的印象,但对于超过8名左右的玩家来说,这是一条死胡同。我可以详细介绍一下这一点,但首先,请阅读“1500名弓箭手”,这将回答您的许多问题。以下

我对这类游戏的协议(和游戏循环)是如何工作的感兴趣;任何建议或见解都将受到赞赏


我猜主循环会有一个世界状态,每秒会前进几个“滴答声”,但是玩家的命令是如何执行的呢?什么样的数据需要来回传输?

查看Wesnoth的战斗


它是免费的,开源的,而且非常棒。你可以从挖掘其来源中学到很多。

帝国时代网络架构讨论


IMHO,这种基于点对点复制重放的体系结构给人留下了深刻的印象,但对于超过8名左右的玩家来说,这是一条死胡同。

我可以详细介绍一下这一点,但首先,请阅读“1500名弓箭手”,这将回答您的许多问题。以下是总结: 首先,由于游戏的实时性,大多数游戏都使用UDP。游戏循环如下所示:

  • 读取网络数据
  • 做客户端预测,并与网络所说的进行比较 您的对象实际上应该是
  • 把物理搞得一团糟,把网络上说的话和你的想法混为一谈 当地的游戏状态是
  • 根据您的操作将数据发送回网络 框架(如有)
  • 渲染
  • 这被大大简化了,“搞乱物理”一书本身就有200页的篇幅,但它涉及到预测客户端可能发生的事情,从服务器获取旧的数据,但准确地告诉对象过去/应该在哪里,然后以某种方式插值这些值,使对象看起来“足够近”到了没有人注意到的地方。这在第一人称射击游戏中是非常关键的,但对于实时策略来说就没有那么重要了

    对于实时策略,通常发生的是基于回合的系统,其中时间被划分为称为“回合”的离散块,这些“回合”按顺序发生,每个回合都有一个由单调函数生成的数字,该函数保证以特定顺序不断增加值,而不会重复。在任何给定的转折点n上,每个客户机向所有其他客户机发送一条消息,告知他们在转折点n+m上的预期操作,其中m是一个通常相当小的任意数字,最好通过试错和播放测试来确定。一旦所有客户机都发送了他们想要的操作,每个客户机就会执行在第n+m轮上发送的所有操作。这在用户命令操作和执行操作时引入了微小的延迟,但这通常是不可察觉的

    有几种技巧也可以用来打发时间。例如,如果你高亮显示一个单位,然后告诉它移动,当它开始移动时,它会发出声音并有动画,但实际上不会立即移动。但是,移动该装置的意图的网络消息会立即发送,因此当屏幕响应播放器的输入时,网络消息已经发送并确认。你可以通过在鼠标点击和游戏对象的响应之间引入一个小的延迟(100毫秒左右)来进一步回避这个问题。玩家通常不会注意到这一点,但在局域网游戏中,100毫秒是一个永恒的时间,即使在家用电脑上有宽带连接,平均ping可能在15-60毫秒左右,这让你有足够的时间在移动前发送数据包

    至于要发送的数据,游戏中有两种类型的数据:确定性数据和非确定性数据。确定性动作以游戏物理为基础,因此当动作开始时,我可以100%保证预测该动作的结果。这些数据永远不需要通过网络发送,因为我可以根据初始状态确定它在客户端上是什么。请注意,在每个客户机上使用具有相同种子的随机数生成器将“随机”事件转化为确定性行为。非确定性数据通常是用户输入,但在许多情况下可以预测用户的输入。在实时策略游戏中,这些配对的方式是,非确定性事件是我的一个游戏对象的某种顺序。一旦游戏对象被命令移动,它移动的方式是100%确定的。因此,您需要在网络上发送的只是对象的ID、给定的命令(使其成为一个枚举以节省带宽)和命令的目标(如果有,那么如果咒语是一个影响区域,那么它可能没有目标,但是移动命令有一个结束目标)。如果用户点击100次以进行单元移动,则无需为每次点击发送单独的移动命令,因为它们都位于同一个普通区域,因此请确保将其过滤掉,因为这会占用您的带宽

    处理命令与其执行之间可能的延迟的最后一个技巧是局部感知过滤器。如果我在命令发出后的某个时间t收到移动命令,我知道该单元应该何时开始移动,并且我知道其最终目的地。我可以晚一点开始它的运动,然后用物理方法稍微加快它的速度,这样它就可以追上它应该在的位置,然后再减慢它的速度,把它放在正确的位置。加速所需的准确值也是相对的,播放测试是确定正确值的唯一方法,因为只有“感觉正确”才能正确。你也可以用发射子弹和导弹来做同样的事情,这是非常有效的。这种方法之所以有效,是因为人类不太擅长观察运动中的细微变化,特别是当一个物体正朝着他们或远离他们时,所以他们不会注意到

    接下来要考虑的是减少带宽。别送我