4

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

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

4

1 回答 1

4

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

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

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

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

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

尽管由于上述原因,这不是典型的使用,但如果您遇到特定的同步问题并且这仍然是您感兴趣的功能,最好在Lance 问题跟踪器中提交功能请求。确保包含有关您的用例的详细信息,以促进健康的讨论

于 2017-06-05T18:35:11.940 回答