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

13

我试图找到最佳方法来完成这个任务,考虑到一个移动端(3G带宽)上的逐回合跨平台游戏,该游戏含有抛射物和掉落方块。

我在想当前玩家角色扮演服务器角色,是否可以在一个设备上运行物理引擎并发送一些“关键帧”数据(块的位置,方向),然后由另一个设备进行插值计算,从而将当前状态插值到接收到的“关键帧”上。 使用此方法,我非常担心需要大量的数据才能确保其他玩家设备上的相同视觉效果。

另一种方法是发送物理数据(力,加速度...)并在其他设备上运行物理引擎,但我担心永远不可能得到完全相同的结果。


如果对象具有相同的起始位置和相同的物理数据应用,那么这些对象在两个设备上的结果不是完全相同吗? - Kjetil
仅在您拥有固定的滴答时间时使用 @Kjetil。如果您在每个图形帧上更新物理,则通常不会出现这种情况。 - Rob Agar
没错 Rob。我不确定,但是问题可能会出现在跨平台(不同的架构)和浮点计算方面,对吧? - JD C4M
1
你可能想要查看Glenn Fiedler在GDC上的出色教程(20112010),这些教程是关于物理程序员网络编程的。它比我在答案中能够提供更好的帮助。 - Bart
2个回答

11

我的当前实现方式如下:

  1. 服务器管理物理仿真
  2. 在任何对象发生重大碰撞时,该对象的绝对位置、旋转以及速度/加速度/力量将被发送到每个客户端。
  3. 客户端将每个对象设置到相应的位置,并施加必要的力。
  4. 客户端计算延迟时间,并根据该时间提前物理系统进行适应。

对我来说,这个方法运行得非常好。我已经在数十个子系统(地图)上运行了物理系统。

我的实现的一些关键点:

完全忽略未标记为“必要”的任何对象。例如,响应于玩家移动的灰尘和粉尘或响应于玩家移动的草和水等基本上是非必要的东西。

顺便提一下,所有这些都通过UDP发送。如果使用TCP,这将是可怕的。


6

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

如果您只发送力量,那么是不起作用的。虽然有可能使其工作,但这比仅发送位置要难得多。您需要两个设备以相同的方式进行计算,因此在每个帧之前,您需要等待来自另一个设备的输入,您需要使用相同的时间步长,脚本需要按相同的顺序运行或可交换,并且您只能使用保证在两台机器上产生相同结果的CPU指令。

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

许多游戏使用客户端 - 服务器模型并进行客户端预测。如果您的游戏是回合制的,则可以不使用客户端预测。相反,您可以使客户端落后于一定的时间,这样当您开始渲染时,您可以相当确定服务器的输入已经存在。仅当客户端可以进行服务器关心的更改(例如移动)时,客户端预测才很重要。


你的意思是每个物理帧都等待输入吗? - RobotRock
我的意思是每个输入帧,它可以与物理帧一对一,也可以不是。最简单的方法是让输入帧和物理帧一对一,但如果你想的话,你可以在每次采样输入时两次更新物理帧。 - notallama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接