我目前正在开发一个使用 Box2D JS 和 Vert.x 作为服务器->客户端框架的在线网络游戏。
我已经搜索了每种方法的优缺点,我真的相信动态时间步长要好得多,因为它并不假设每个客户端都具有相同的处理能力,但是,有一些(很多)人认为固定时间步长是好多了。
请赐教。
我目前正在开发一个使用 Box2D JS 和 Vert.x 作为服务器->客户端框架的在线网络游戏。
我已经搜索了每种方法的优缺点,我真的相信动态时间步长要好得多,因为它并不假设每个客户端都具有相同的处理能力,但是,有一些(很多)人认为固定时间步长是好多了。
请赐教。
如果您的时间步不同步,您基本上可以将确定性抛到脑后。即使是这样,确定性也很困难。
在模拟上花费更少的计算将产生最初可能并不明显的实际成本。对于每个不同的设置(在动态时间步长/迭代的情况下,对于每个不同的单独执行),相同输入上的结果行为可能不同。您可以让用户在非常慢的硬件上运行,这可能会完全欺骗您的关卡。
在多人游戏引擎环境之外,确定性可能稍微不那么重要,但是仅仅没有确定性系统会使推理几乎任何事情(游戏机制,游戏难度,漏洞)变得更加困难,这几乎可以影响我的所有类型的游戏能想到。想象一个不确定的益智游戏。
我真的相信修复时间步长是最好的方法。我记不太清楚了,但在我们的一款游戏中,我们遇到了碰撞期间动态时间步长的问题。当然,大多数人会说我们的碰撞检测代码要么写得不好,要么我们可以使用一些先进的技术,如光线投射,但我们最终以固定的时间步长着陆,使用 for 循环在延迟似乎更长时进行物理更新,因为设备处理能力缓慢或其他原因(CPU 忙?)等。这个过程很简单,我们都对结果很满意 :)
我认为 Box2D 的创建者本人赞成固定时间步长,虽然找不到资源 atm,但我在某处读过它。
我们可以假设您正在尝试在所有客户端上获得相同的模拟结果吗?如果是这样,我认为您需要解释为什么让他们都进行不同的计算是个好主意!
或者您的意思是所有客户端都将执行相同的计算,但时间步长会随着模拟的进行而变化,但这是相当令人头疼的实现和调试。为了让每个客户端得出相同(或至少相似)的结果,他们需要为每个步骤使用相同长度的时间步长,因此您也需要通过网络发送它,例如。物理步 32241 是 16 毫秒,步 32242 是 18 毫秒。除了需要额外的网络流量之外,每个客户端在收到此信息之前都不知道要使用多长的时间步长。它从哪里接收它?大概最慢的客户端将决定每个人应该走多快?我看不出它以任何其他方式工作。所以客户端也必须不断地让服务器知道他们可以处理多少处理,速度越快的客户端就会被拖到那个级别的性能上。
但正如史蒂文所说,即使解决了这些技术难题,也会出现其他问题。最值得注意的是重力的影响会随着不同的时间步长而变化,因此例如在平台游戏中,玩家可以跳跃的高度会不断变化。如果有通常可以访问的平台,当较慢的客户端加入时,它们可能会突然变得无法访问。
如果您确实意味着每个客户端将使用任何感觉的时间步长,那将起作用,但服务器需要以非常频繁的间隔发送世界状态的官方快照,以使所有客户端都被 snyced。从技术上讲,这将更容易实现,并且每个客户端都将尽可能顺利地运行,但随着世界状态被更正为官方状态,对于运行速度比服务器更快或更慢的客户端来说,会有更多的抖动。嗯……也许这毕竟是最好的办法。您可能会对这篇解释 Quake3 如何执行以下操作的文章感兴趣:http: //trac.bookofhook.com/bookofhook/trac.cgi/wiki/Quake3Networking