是否有必要在worldUpdate中包含物理学是确定性的GameObjects?

时间:2017-06-04 14:00:51

标签: multiplayer extrapolation lance

为了减少数据传输大小和为每个worldUpdate序列化世界对象的计算时间,我想知道是否可以省略物理可以在客户端gameEngine上完整,忠实地模拟的对象的同步(他们不是playerObjects所以playerInput不直接影响它们,它们的物理完全是确定性的)。与这些GameObjects的交互完全由GameEvents处理,而这些GameEvents的频率要低得多。如果客户端运行与服务器相同的物理并且可以访问相同的初始条件,我觉得这应该是可能的。

当我尝试从后续的worldUpdates中省略GameObjects时,我发现它们的动作变得更加不连贯,并且它们的移动速度比没有省略时更快;然而,当我在保持客户端打开的同时停止游戏服务器时,如果我没有省略它们,它们的动作就更像我期望的那样。这都是在我的本地机器上进行外推同步。

1 个答案:

答案 0 :(得分:4)

简短的回答是Lance的最新版本(撰写本文时为1.0.8)并不支持用户从世界更新中省略游戏对象,但它确实实现了省略对象的差异机制如果他们的netScheme属性无法更改,则会更新,从而节省带宽。

这意味着,如果你有静态物体,例如墙壁,它们只会为每个玩家传输一次。根本不传输这个是一个有趣的功能。

如果你所指的对象不是静态的,那么就没有真正的方法可以确定地知道它们的位置。您可能已考虑使用世界步数,但由于网络的固有延迟,不同的客户端会在不同时间处理不同的世界步骤。客户端无法知道服务器在给定时间点处理的真正步骤是什么,因此无法确定性地决定这样的对象的位置。这就是为什么Lance使用Authoritative server model - 允许一个单一的事实来源,并确保客户端同步。

如果您仍想手动避免为对象发送更新,则可以编辑其netScheme,以便除了其ID之外不会返回任何内容,例如:

static get netScheme() {
    return {       
        id: { type: Serializer.TYPES.INT32 }
    };
}

由于上述原因,它不是典型的用途,因此如果您遇到特定的同步问题并且这仍然是您感兴趣的功能,那么最好提交一个Lance issue tracker中的功能请求。确保包含有关用例的详细信息,以促进健康的讨论