Networking 如何在多人游戏中同步物理?

Networking 如何在多人游戏中同步物理?,networking,mobile,game-physics,multiplayer,Networking,Mobile,Game Physics,Multiplayer,我试图找到最好的方法来做到这一点,考虑一个轮流跨平台的移动游戏(3G带宽)与弹射和下降块 我想知道一个设备(当前玩家回合=服务器角色)是否可以运行物理并向另一个设备发送一些“关键帧”数据(块的位置、方向),而另一个设备只是从当前状态插值到接收到的“关键帧”。 使用这种方法,我非常担心在其他玩家的设备上保证相同视觉效果的大量数据 另一种方法应该是发送物理数据(力、加速度…)并在另一台设备上运行物理,但我担心永远不会有相同的结果。您需要发送绝对位置和旋转 你说得对,如果你只派军队,那是行不通的。这是

我试图找到最好的方法来做到这一点,考虑一个轮流跨平台的移动游戏(3G带宽)与弹射和下降块

我想知道一个设备(当前玩家回合=服务器角色)是否可以运行物理并向另一个设备发送一些“关键帧”数据(块的位置、方向),而另一个设备只是从当前状态插值到接收到的“关键帧”。 使用这种方法,我非常担心在其他玩家的设备上保证相同视觉效果的大量数据


另一种方法应该是发送物理数据(力、加速度…)并在另一台设备上运行物理,但我担心永远不会有相同的结果。

您需要发送绝对位置和旋转

你说得对,如果你只派军队,那是行不通的。这是可能的,但这比仅仅发送职位要困难得多。您需要两台设备以相同的方式进行计算,因此在每一帧之前,您需要等待来自另一台设备的输入,您需要使用相同的时间步长,脚本需要以相同的顺序运行,或者是可交换的,并且您只能使用CPU指令来保证在两台机器上给出相同的结果

最后一个问题尤其严重,因为它意味着不能使用浮点数(浮点数/单位数或双位数)。您必须使用整数,或滚动您自己的数字格式,因此无法利用许多现有工具


许多游戏使用客户端预测的客户端-服务器模型。如果您的游戏是基于回合的,您可能不需要使用客户端预测就可以成功。相反,您可以让客户机延迟一段时间,这样您就可以相当确定在您进行渲染时服务器的输入已经存在。只有当客户端可以进行服务器关心的更改(如移动)时,客户端预测才很重要。

我当前的实现是这样工作的:

  • 服务器管理物理模拟
  • 在任何对象发生重大碰撞时,对象的绝对位置、旋转和速度/加速度/力都会发送给每个客户端
  • 客户端将每个对象设置在该位置及其速度,并应用必要的力
  • 客户机计算延迟,并将物理系统提前到该数量以适应延迟时间
  • 对我来说,这很有效。我的物理系统运行了几十个子系统(地图)

    有关我的实施的一些关键事项:

    完全忽略任何未标记为“必要”的对象。例如,对玩家移动做出反应的污垢和灰尘颗粒,或对玩家移动做出反应的草地和水。基本上是非必要的东西


    顺便说一下,所有这些都是通过UDP发送的。这在TCP上是可怕的。

    如果对象具有相同的起始位置和应用的物理数据,那么对象在两台设备上的结果不是完全相同吗?@Kjetil仅当您有固定的滴答时间时。如果你在每一个图形帧上更新物理,通常情况下就不会是这样了。我不确定,但考虑到跨平台(不同的体系结构)和浮点计算,问题应该会出现,不是吗?你可能想看看Glenn Fiedler为物理程序员编写的优秀GDC教程(和)。它比我能回答的要好得多。通过等待每一帧的输入,我认为你是指每一个物理帧?我是指每一个输入帧,它可以是物理帧的1比1,也可以不是。将输入帧和物理帧设置为1对1是最容易的,但如果愿意,可以在每次采样输入时更新物理两次。