然而,在使用苹果A6芯片的新iOS设备进行测试时,出现了不同步的问题。查看日志文件让我觉得不同步很快就发生了,可能是由于某些浮点运算引起的,但我还不能确定具体是哪个操作。
我可以保证,在游戏设计中只需要同步Box2D模块,所有的多人游戏命令和输入都没有不同步的情况。
我已经尝试将所有的三角函数:sinf、cosf、pow、sqrtf、atan2f改成双精度版本,但没有任何效果。
有没有办法强制苹果A6将浮点数处理方式与苹果A5相同,比如一些编译器选项?
非常感谢您的回答。
实际上是Nguyen Truong Chung再次出现了。
非常感谢你们迄今为止的回答。我非常感激你们的答案,它们为我启示了继续调试的道路!目前,我已经找到了不同步的原因,但还没有具体的解决方案。我希望提供给您我得到的信息,并希望我可以得到更多的洞察力。
1. 发现:
我有一个使用cos函数的函数。我像这样打印日志:
void rotateZ(float angle)
{
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. 再次测试:
故事并没有结束,因为:
{ unsigned int zz = 0x404800d2;
float yy = 0;
memcpy( &yy, &zz, 4 );
const float temp1 = cos( yy );
printf( "%x\n", *(unsigned int*)&temp1;
}
我在同一台iPhone4上运行了上面的代码,你猜怎么着?我得到了这个结果:bf7ff708。
我把那段代码放在游戏的更新循环中,每次循环得到的结果仍然是bf7ff708。
更有甚者,值0x404800d2是游戏的初始化值,所以每次游戏开始时,上述两行不同步的代码总是存在的。
3:问题:
所以,我决定忘记上述发生的事情,并暂时用我在dreamcode.net上找到的简单的Taylor实现代替sin、cos函数。不再出现不同步的问题了。
看起来,即使在同一台iPhone 4(OS版本为5)上,cos函数也不是确定性的。
我的问题是:我们有没有解释为什么cos函数在同一台手机上对相同的输入返回不同的结果?这里我有输入0x404800d2,但却得到了两个不同的输出:bf7ff708和bf7ff709。然而,我无法通过编码来重现bf7ff709的结果。
我想我需要操作系统数学函数的源代码(浮点版本),才能清楚地理解这个问题。上述我发现的问题足以作为一个错误报告吗?
这是Nguyen Truong Chung。
非常感谢您迄今为止的帮助。
我想报告一下,在我重写了所有超越函数,如cos、sin、sqrt、pow、atan2、atan、asin、acos等(尽可能多),不同步问题已经解决了。