我应该在网络游戏中使用固定或动态时间步吗?

时间:2013-04-18 09:16:36

标签: javascript box2d timedelta vert.x

我目前正在使用Box2D JS和Vert.x作为服务器 - >客户端框架开发在线网络游戏。

我已经搜索了每个的优点和缺点,我真的相信动态时间步骤要好得多,因为它不假设每个客户端具有相同的处理能力,但是,有一些(很多)人认为固定时间步长要好得多。

请赐教。

3 个答案:

答案 0 :(得分:1)

如果您的时间步长不同步,您基本上可以将确定性抛出窗口。即使它们存在,决定论也很困难。

在模拟上花费较少的计算将产生实际成本,这些成本最初可能并不明显。对于每个不同的设置(并且在动态时间步长/迭代的情况下,对于每个不同的单独执行),在相同输入上的结果行为可以是不同的。您可以让用户在非常慢的硬件上运行,这可能会完全欺骗您的级别。

在多人引擎环境之外,确定性可能稍微不那么重要,但是根本没有一个确定性的系统将使得几乎任何事物(游戏机制,游戏难度,漏洞利用)的推理几乎变得更加困难。我能想到的游戏。想象一下不确定性的益智游戏。

答案 1 :(得分:0)

我真的相信修理时间步是最好的方法。我记不起来了,但在我们的一个游戏中,我们在碰撞过程中遇到了动态时间步问题。当然,大多数人会说我们的碰撞检测代码要么编写得不好,要么我们可以使用一些先进的技术,比如光线投射,但我们最终登陆固定的时间步长,使用for循环,只要延迟看起来更长,就会进行物理更新设备处理能力慢或其他原因(CPU忙?)等等。这个过程很简单,我们都很满意结果:)

我认为Box2D的创建者本人赞成固定的时间步长,虽然无法找到资源atm,但我在某处读到了它。

答案 2 :(得分:0)

我们可以假设您正试图在所有客户端上获得相同的模拟结果吗?如果是这样,我认为你需要解释你的理由为什么让他们都做不同的计算是个好主意!

或许您的意思是所有客户端都会进行相同的计算,但时间步长会随着模拟的进行而变化,但这是相当实施和调试的头痛。对于每个客户提出相同(或至少相似)的结果,他们需要为每个步骤使用相同的长度时间步长,因此您还需要通过网络发送它,例如。物理步骤32241是16ms,步骤32242是18ms。除了需要额外的网络流量之外,每个客户端在收到此信息之前不知道要使用的时间长度。它从哪里收到?据推测,最慢的客户会决定每个人应该走得多快?我无法看到它以任何其他方式工作。因此,客户端还必须不断让服务器知道他们可以处理多少处理,并将更快的客户端拖到这个性能水平。

但正如史蒂文所说,即使在这些技术困难得到解决之后,也会出现其他问题。最值得注意的是重力随着时间步长的变化而变化,例如在平台游戏中,玩家可以跳跃的高度会不断变化。如果存在通常只能访问的平台,则当较慢的客户端加入时,它们可能突然变得无法访问。

如果你的确意味着每个客户端都会使用任何时间长度感觉,那就可以了,但是服务器需要以非常频繁的间隔发送世界状态的官方快照,以使所有客户端都被窃听。从技术上讲,这将更容易实现,并且每个客户端都可以尽可能顺利运行,但随着世界状态被更正为官方状态,对于运行速度比服务器更快或更慢的客户端更加急躁。嗯...也许这是最好的方式。您可能对本文解释Quake3如何执行以下操作感兴趣:http://trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking