我正在为 iOS 开发一款采用 Box2D 物理原理的多人游戏。多人游戏照常使用锁步方法。游戏定期更新物理世界。具有相同CPU的iOS设备之间不会出现不同步。
但是,在使用 Apple A6 芯片的新 iOS 设备进行测试时,发生了不同步。查看我的日志文件给我的印象是,不同步发生得非常快,这可能是因为一些浮点操作,我还无法找出是哪一个。
我可以保证,在游戏的设计中,只有Box2D是唯一需要同步的模块,并且根据我的日志,所有多人命令和输入都不会不同步。
我尝试将所有超越函数:sinf、cosf、pow、sqrtf、atan2f 更改为 double 版本,但没有任何运气。
有没有办法强制Apple A6像某些编译器选项一样对待 float 与Apple A5相同?
我将非常感谢任何回答。
最佳答案
许多数学库函数在 A5 和 A6 上使用不同的算法。如果它们的差异超过一两个 ulp,您可能发现了一个错误;请报告。否则,变化可能在高质量数学库的预期容差范围内。要了解其原因,最好的引用是 Ian Ollmann 几年前发送给 mac-games-dev 邮件列表的电子邮件,"the math library is not a security tool" ,它在 Mac OS X 的背景下解决了这个确切的问题。(tl;dr 版本是一些游戏开发人员想要的跨架构提供相同结果的目标,从根本上与提供高精度答案相冲突,因为在所有架构上尽可能高效,这是所有开发人员 [和用户,因为它有利于响应能力和电池生命周期] 所希望的;必须给予一些东西,对于通用系统库,后者必然优先)。 Apple 开发者论坛将是查找信息的另一个好地方。
关于iphone - Apple A5 和 Apple A6 CPU 之间的浮点确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13888903/