确定性的多人RTS游戏的问题?

我正在开发跨平台的多人RTS游戏,其中不同的客户端和服务器(闪存和C#)都需要保持确定性的同步

为了处理浮点不一致,我遇到了这个方法: http ://joshblog.net/2007/01/30/flash-floating-point-number-errors/#comment-49912它基本上截断了非确定性部分:

return Math.round(1000 * float) / 1000; 

那么我担心的是,每次出现分歧时,还有更多的机会创造更多的浮点错误,实质上会让这种错误变得更糟?

所以它发生在我身上,这样的事情如何:

 function floatSafe(number:Number) : Number {return Math.round(float* 1024) / 1024; } 
  • 只用2的幂分 ? 你怎么看?

讽刺用上述方法,我得到了不太准确的结果:

 trace( floatSafe(3/5) ) // 0.599609375 

与其他方法(除以1000)一样,或者只是跟踪原始值,我得到3/5 = 0.6

或者也许这就是3/5实际上,IE 0.6不能真正用浮点数据types表示,并且在不同的平台上会更一致?

浮点不是“非确定性”的。 没有随机性 1/10的浮点值将总是大于1/10的实际值,而不仅仅是一些时间。 规则是可预测的 – 有时很难知道它使用的规则。

无论如何,四舍五入的价值是不能保证工作,即使积累的错误不是一个问题。 任何引入的单个错误(错误可以被定义为与假设基线不同的结果)可能会导致四舍五入的值或舍入值的差异,所以舍入操作本身可能在不同的机器上产生不同的结果。 所以基本上,你可以消除99.9%的不准确之处,换取0.1%的误差。

更好的办法是使用一些确定性的东西,比如定点algorithm,或者设置处理器的浮点规则(这可能不适用于你的平台)。

像0.99900000000000000001那样的值是因为浮点数根本不能表示原始数字,因为实际操作不正确。

http://steve.hollasch.net/cgindex/coding/ieeefloat.html

这是一个IEEE标准,只是为了给你一个理由为什么舍入不会工作。 这并不意味着所有的CPU都使用这种格式。

我认为人们通过电线将他们的浮点数字序列化为标准格式,并在另一端重新创建浮点数,但是我不完全确定。 你可以尝试做一些类似于LISP编程的语言,并把它看作一个“x / y”,然后把x和y发送给客户端,让他执行“x / y”来获得浮点数。