在我正在开发的多人游戏中,我们有一些浮点数值。后端(在PHP中)和前端(在Flash中)偶尔会对这些数字执行相同的计算,以最大限度地减少通信。
我目前正在确保双方都使用64位双打,但我可以安全地假设所有计算都是相同的吗?
例如,如何将字符串转换为浮点数 - 我应该担心Flash与PHP有不同的实现吗? (如果发生这种情况,我们的游戏将不同步 - 客户端会认为它处于一种状态,而服务器位于另一种状态)
通过一些测试,显示是相同的,但我只是不确定。有人可以为我澄清一下吗?
答案 0 :(得分:2)
你不能,因为不同的编译器甚至可以为同一个表达式生成不同的代码,但我们正在比较上帝编译的不同解释器知道什么。
大多数情况下,根据所需的精度,你会很好,但是在计算数学上应该相同的数字时会发生边缘情况,但实际上并不是这样,因为操作顺序不同,就像试图平衡针一样它的提示。定期更新不会改变数字显着不同的事实。
如果要使用浮点数,您应该设计一些带有误差余量的数值算法。或者,您可以将固定点算法用于性能可能受网络限制但在其他地方使用浮点数的状态。
答案 1 :(得分:0)
我会假设它确实是相同的浮点代码。除了你发送定期检查点(计算完整数据的帧而不仅仅是增量),对吗?任何小错误都会在这些错误中得到纠正。
答案 2 :(得分:0)
好吧,如果你可以限制有效小数位数,那么你不会暴露于舍入错误,并将你自己的字符串版本转换为浮点转换以及你怀疑可能有不同的任何其他方法对平台的影响,我认为你很好。