AS3中有实现确定性物理的方法吗?

3

听起来ActionScript 3的Box2D不是确定性的,也就是说,在多人游戏中,物理学在决定胜负方面起着重要作用,如果用户的微处理器来自不同技术(例如英特尔和AMD),则每个用户的结果都会不同。

那么,有没有办法在AS3中实现确定性物理学?这已经实现过了吗?

谢谢。


这篇文章讲述了一个很好的话题,关于AS3中无法拥有确定性引擎,除非你能编写一些非常简化和定制化的内容适用于游戏。 - Bartosz
3
你可以尝试在PHP或Python中编写物理引擎的服务器端,这样每个玩家都会得到相同的结果。 - Jonan
我明白了,那么是否考虑使用一种匹配系统,只匹配具有相似CPU架构的玩家呢?这样会有帮助吗? - Artemix
@bejrut 主要问题在于sin/cos/log等函数的实现有些不太正确,因为它们总是在协处理器中执行。可以避免使用Math.sin()等函数,而是实现一个固定点插值表来近似这些函数。不要过于简化,只需使用预生成的一组值,将其嵌入到您的SWF中,然后您就可以比以前更具确定性的物理效果了。(我不能说是“绝对”确定性,还有其他问题需要解决,但肯定是可行的。) - Vesper
1个回答

0

我曾经遇到过这个问题。

我们在Shockwave Director中使用Havok引擎模拟一个逼真的2人3D台球游戏。

为了准确性和安全性,最好在服务器上进行处理。然而,我无法负担任何服务器端物理处理,而客户端处理即使起始参数相同,也会给不同的客户端带来不同的结果。

我们的情况并非100%适用于任何多人游戏,但可以进行调整。这是一个回合制游戏,每个玩家都会进行一次打击,球由Havok处理,两个玩家都必须看到相同的最终结果。

所以,我们采取了以下措施:

  1. 正在轮到的玩家是领先玩家。他进行一次打击。他的打击数据(打击力量,球杆位置和旋转)被发送到服务器,然后再发送到第二个玩家。
  2. 两个玩家在本地进行模拟。他们都有相同的打击数据,因此结果将大致相同。
  3. 在领先玩家的模拟停止后,他将最终球的位置发送到服务器,服务器再将其发送到第二个玩家。一旦第二个玩家的模拟停止,他将使用领先玩家的数据调整最终球的位置。这看起来就像球已经停下来,然后跳到了稍微不同的位置。

总的来说,这看起来并不太顺畅,但它将确保在每个回合开始时玩家看到相同的游戏配置。

将此方法应用于更通用的多人游戏(例如,连续动作而没有回合,超过2个玩家),可以做类似的事情:

  1. 选择(可能是随机的,也可能基于某些特定数据,如延迟等)一个领先的玩家。
  2. 收集所有玩家的行动数据,本地运行他们的模拟。
  3. 定期对领先玩家的数据进行快照,并通过服务器更新将其发送给其他玩家。其他玩家必须根据接收到的数据调整他们的模拟(更改对象位置以及它们的角度、冲量等)。更频繁地进行快照将导致更平滑的模拟,但会增加流量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接