我应该坚持定点数类的 32 位或 64 位类型



我一直在用C#开发一个游戏,它目前使用浮点进行一些计算和算术。该游戏将具有网络功能和基本的回放系统,该系统可随着时间的推移跟踪输入和基本玩家操作。我认为这些功能要求我让每个重要的核心机制都具有确定性。由于浮点数的不确定性属性,我浏览了一些关于定点数的资源,以便为自己提供浮点数的替代方案。

我理解定点的许多核心概念,因为关于这个问题的各种非常有据可查的在线资源。但是,我不确定我是否应该使用 32 位类型 (int) 或 64 位类型(long) 作为定点类的原始值。

我希望我的班级具有以下基本功能:

  • 传递浮点数、双精度或整数并将其转换为定点值。
  • 加法、减法、除法、乘法与定点、
  • 整数、浮点数和双精度型值的对比。

我的假设是,最好使用 long,因为它会给我更多的十进制精度,但我担心在此过程中可能出现的潜在障碍。例如,在面向 32 位或在 32 位计算机上运行时,使用 long 是否会提供问题?当涉及到潜在的硬件配置时,int 最终是否比 long 更兼容?由于游戏性能较重,从浮点数切换到长定点数时,性能损失是否很大?

这似乎是一个愚蠢的问题,但我想我想知道我是否应该使用基于我希望我的程序运行的 cpu 架构的最低公分母的类型,或者这些问题通常由编译器在编译期间处理?Linux或Mac osx处理长计算的方式会与Windows机器不同吗?

您使用的类型与平台无关,因为在 C# 中,类型就是类型。 换句话说,无论您在哪个平台上,long 始终是 64 位。 这是 C# 的保证。

然而,真正的问题将是精度和规模。在进行定点数学运算时,您必须选择要使用的精度。 这是一个简单的问题。 不容易的是扩展。 如果你的数字将超过所选类型的最大值(不要忘记在此考虑中包括小数),那么你就被打破了大门。

您是否研究过decimal类型?

decimal仍然是浮点类型,但它是浮点十进制,而不是二进制浮点IEEE754因此能够表示您扔给它的任何以 10 为基数的数字,只要它符合decimal类型的小数位数和精度。

有关decimal类型的信息,请参阅以下链接:

  • C# 深度:十进制
  • MSDN C# 十进制参考

但是,decimal有一些性能考虑因素,如果性能至关重要,则可能不是游戏的最佳选择。 对于一个简单的 2D 滚动器,你会很好,但它可能不适合除此之外的任何事情。

所有目标的结果将完全相同。整数数学就是这样很好,你真的可以依靠它同时是相同的。

但是,使用long会更慢,尤其是在针对32位计算机时,但在64位计算机上也是如此。虽然在 64 位机器上添加 int 和添加 longs 需要相同的时间(如果它实际上是 64 位代码),但如果您没有两倍大的类型,则执行定点乘法需要一些额外的代码。64位除法也有同样的问题。当然,在 32 位机器上,64 位操作是使用多个 32 位操作模拟的,因此它们本质上会稍微慢一些。

另一方面,有时您可能需要额外的精度。最后,您可能需要 32 位固定点类型和 64 位固定点类型,甚至需要具有不同位置基数点的多个固定点类型。

最新更新