我试图找到最佳方法来完成这个任务,考虑到一个移动端(3G带宽)上的逐回合跨平台游戏,该游戏含有抛射物和掉落方块。
我在想当前玩家角色扮演服务器角色,是否可以在一个设备上运行物理引擎并发送一些“关键帧”数据(块的位置,方向),然后由另一个设备进行插值计算,从而将当前状态插值到接收到的“关键帧”上。 使用此方法,我非常担心需要大量的数据才能确保其他玩家设备上的相同视觉效果。
另一种方法是发送物理数据(力,加速度...)并在其他设备上运行物理引擎,但我担心永远不可能得到完全相同的结果。
我试图找到最佳方法来完成这个任务,考虑到一个移动端(3G带宽)上的逐回合跨平台游戏,该游戏含有抛射物和掉落方块。
我在想当前玩家角色扮演服务器角色,是否可以在一个设备上运行物理引擎并发送一些“关键帧”数据(块的位置,方向),然后由另一个设备进行插值计算,从而将当前状态插值到接收到的“关键帧”上。 使用此方法,我非常担心需要大量的数据才能确保其他玩家设备上的相同视觉效果。
另一种方法是发送物理数据(力,加速度...)并在其他设备上运行物理引擎,但我担心永远不可能得到完全相同的结果。
我的当前实现方式如下:
对我来说,这个方法运行得非常好。我已经在数十个子系统(地图)上运行了物理系统。
我的实现的一些关键点:
完全忽略未标记为“必要”的任何对象。例如,响应于玩家移动的灰尘和粉尘或响应于玩家移动的草和水等基本上是非必要的东西。
顺便提一下,所有这些都通过UDP发送。如果使用TCP,这将是可怕的。
您需要发送绝对位置和旋转。
如果您只发送力量,那么是不起作用的。虽然有可能使其工作,但这比仅发送位置要难得多。您需要两个设备以相同的方式进行计算,因此在每个帧之前,您需要等待来自另一个设备的输入,您需要使用相同的时间步长,脚本需要按相同的顺序运行或可交换,并且您只能使用保证在两台机器上产生相同结果的CPU指令。
最后一个问题尤其成为问题,因为它意味着您不能使用浮点数(floats / singles或doubles)。您必须使用整数或自己的数字格式,因此无法利用许多现有工具。
许多游戏使用客户端 - 服务器模型并进行客户端预测。如果您的游戏是回合制的,则可以不使用客户端预测。相反,您可以使客户端落后于一定的时间,这样当您开始渲染时,您可以相当确定服务器的输入已经存在。仅当客户端可以进行服务器关心的更改(例如移动)时,客户端预测才很重要。