确定性浮点和.NET

use*_*934 11 floating-point deterministic multiplayer real-time-strategy

我如何保证.NET应用程序中的浮点计算(比如在C#中)始终产生相同的位精确结果?特别是在使用不同版本的.NET并在不同平台上运行时(x86 vs x86_64).浮点运算的不准确无关紧要.

在Java中我会使用strictfp.在C/C++和其他低级语言中,这个问题基本上是通过访问FPU/SSE控制寄存器来解决的,但这在.NET中可能是不可能的.

即使控制了FPU控制寄存器,.NET的JIT也会在不同平台上生成不同的代码.在这种情况下,像HotSpot这样的东西会更糟糕......

我为什么需要它?我正在考虑编写一个实时策略(RTS)游戏,它在很大程度上依赖于快速浮点数学和锁定步进模拟.基本上我只会通过网络传输用户输入.这也适用于通过存储用户输入来实现重放的其他游戏.

不是一个选择:

  • 小数(太慢)
  • 固定点值(使用sqrt,sin,cos,tan,atan时太慢和麻烦......)
  • 像FPS一样在网络上更新状态:不能选择发送数百或几千个单位的位置信息

有任何想法吗?

cod*_*fun 2

我不确定你的问题的确切答案,但你可以使用 C++ 并在 c++ dll 中完成所有浮动工作,然后通过互操作将结果返回到 .Net。