Apple A5和Apple A6 CPU之间的浮点确定性

时间:2012-12-15 02:57:56

标签: iphone floating-point box2d deterministic

我正在开发一款适用于iOS的Box2D物理多人游戏。多人游戏正常使用锁步法。游戏及时更新物理世界。具有相同CPU的iOS设备之间没有任何异步。

然而,当使用带有Apple A6芯片的新iOS设备进行测试时,发生了异步。查看我的日志文件给我的印象是,desync发生得非常快,可能是因为我找不到哪些浮点运算。

我可以保证只有Box2D是游戏设计中唯一需要同步的模块,所有mutliplayer命令和输入都不会根据我的日志不同步。

我试过改变所有先验功能:sinf,cosf,pow,sqrtf,atan2f到双版本,但没有任何运气。

有没有办法强制Apple A6将浮点数与某些编译器选项一样处理Apple A5?

我真的很感激任何答案。

3 个答案:

答案 0 :(得分:5)

许多数学库函数在A5和A6上使用不同的算法。如果它们相差超过一两个ulp,你可能发现了一个bug;请报告。否则,变化可能在优质数学库的预期容差范围内。为了了解其原因,最好的参考是Ian Ollmann几年前发给mac-games-dev邮件列表的电子邮件"the math library is not a security tool",它在Mac OS X的背景下解决了这个问题。 (tl; dr版本的目标是在一些游戏开发者想要的架构之间提供比特相同的结果,与在所有开发人员[和所有用户]的所有架构上尽可能高效地提供高精度答案相冲突。因为它有利于响应性和电池寿命所需;必须提供某些东西,而对于通用系统库,后者必须优先考虑。 Apple开发者论坛将是另一个寻找信息的好地方。

答案 1 :(得分:3)

实际上是Nguyen Truong Chung。

到目前为止,非常感谢你的回答。我非常感谢你的回答,这启发了我继续调试的道路!目前,我以某种方式找出了同步的原因,但还没有具体的解决方案。我希望为您提供我所获得的信息,希望我能够获得更多的信息。

1。发现:

我有这个使用cos的功能。我打印了这样的日志:

void rotateZ(浮角)

{

 if( angle )

 {

      const float sinTheta = sin( angle );

      const float cosTheta = cos( angle );



      // I logged here

      myLog( "Vector3D::SelfRotateZ(%x) %x, %x", *(unsigned int*)&angle, *(unsigned int*)&cosTheta, *(unsigned int*)&sinTheta );



      ....
 }

}

Desync发生在这样:

在iPad4上:Vector3D :: SelfRotateZ(404800d2)bf7ff708,3c8782bc 在iPhone4上:Vector3D :: SelfRotateZ(404800d2)bf7ff709,3c8782bc

2。重新测试

故事并不止于此,因为:

  1. 我在游戏开始时尝试了这些代码:
  2. {     unsigned int zz = 0x404800d2;

    float yy = 0;
    
    memcpy( &yy, &zz, 4 );
    
    const float temp1 = cos( yy );
    
    
    printf( "%x\n", *(unsigned int*)&temp1;
    

    }

    1. 我在同一台iPhone4上运行了上面的代码,猜猜是什么?我得到了这个:bf7ff708

    2. 我把代码放在游戏的更新循环中,我得到的结果在每个循环中仍然是bf7ff708。

    3. 还有什么?值0x404800d2是游戏的初始化值,因此每次游戏开始时,上面的两条异步行始终存在。

    4. 3:提问:

      所以,我决定忘记上面发生的事情,并暂时用dreamcode.net上发现的简单Taylor实现取代了sin,cos函数。 desync不再发生。

      似乎cos功能在同一iPhone 4(OS版本5)上甚至不具有确定性。

      我的问题是:我们是否有解释为什么cos函数在同一部手机上为同一输入返回不同的结果?这里我有输入0x404800d2和两个不同的输出:bf7ff708和bf7ff709。但是,我无法通过简单的编码来重现bf7ff709的结果。

      我想我需要OS(浮点版)的数学函数的源代码才能清楚地理解这一点。上面的问题我发现错误报告了吗?

答案 2 :(得分:1)

实际上是Nguyen Truong Chung。 :)

非常感谢你们的帮助。

我只想报告在重新编写所有超越函数(如cos,sin,sqrt,pow,atan2,atan,asin,acos等)后(尽可能多)修复了desync。