不同系统上的浮点数和数学精度

时间:2011-01-31 12:49:10

标签: actionscript-3 flash floating-accuracy

我想在项目中实现游戏性录制功能,该功能仅在级别开始时记录玩家输入和RNG的种子。然后我可以拿这样的唱片并在我的电脑上播放它以测试它的有效性。

我只关心不同Flash Player版本,操作系统或CPU(或任何可能受影响的其他)之间可能出现的一些数字差异。该项目将为Flash Player 10.0.0+编写。我关心的是什么:

  • 数字运算:乘法,除;位操作(也可能是位移);加减;模
  • 数学课:罪,cos和atan2;舍入
  • localToGlobal / globalToLocal with rotations and scaling

我不会使用hitTest,getObjectsUnderPoint,hitTestPoint,getBounds等东西,所有碰撞都是几何的。

那么,有没有机会使用上述任何尖锐的东西会在不同的系统上产生不同的结果?如果是这样,我该怎么办才能避免它们?

3 个答案:

答案 0 :(得分:1)

这是一个有趣的问题......

这不是“这个游戏将在多个平台上播放相同”,它是“用户输入的录音会在模拟时生成完全相同的输出”问题。

我的直觉会说“不要担心闪存虚拟机会消除差异”,但随后我想更多,有些地方可能会出现问题。

首先,我不会记录任何基于时间的内容。用户在1.21秒内按键可能很难预测是否在帧计算值之前或之后发生,特别是如果录制或回放计算机负载不足。尝试使用用户输入补间时间可能是失败的一个因素。

浮点的准确性应该没问题。定义何时舍入的算法在IEEE-754中有详细记录,并且所有VM都使用64位数,而不管它们运行的​​是什么操作系统。我猜测数学运算同样被理解。

我认为避免使用hitTest等等是件好事。我想他们理论上可能会受到硬件加速是否被使用的影响。但我不是那里的专家,所以也许不是。

现在localToGlobal / globalToLocal ......我只是不知道。他们可能有理论上的硬件加速问题,但我倾向于怀疑它。

所以我想我没有给出任何真正的答案。

答案 1 :(得分:1)

Trig功能不起作用!您必须创建以下内容的自定义实现:acos,asin,atan,atan2,cos,exp,log,pow,sin和sqrt。显然,随机()。

我还在测试Number类。我不能肯定是否添加/减法/等。在每台机器上都会保持一致。

答案 2 :(得分:0)

不太可能(尽管可能)事情在不同的计算机上会以明显不同的方式运行。即使他们这样做了,这也是一件非常罕见的事情,除非对游戏玩法绝对至关重要,否则我不建议担心。