使用正确的编译器标志在每个平台上进行相同的模拟

时间:2017-04-05 17:55:24

标签: c++ gcc cross-platform game-engine compiler-optimization

我正在开发游戏Remnants of Naezith大约2。5年,这个游戏的主干是排行榜,它有重放。游戏是完全确定的,因此相同的输入每次都会导致相同的模拟。 游戏在C ++和SFML中完全从头开始编写

几个月前我把我的gcc编译器从64位更改为32位或反向,我没有记错,但问题是,旧的重放在新的编译器中不起作用。当我搜索它时,两点之间的浮点数学不同。

我通过输入 -msse2 -mfpmath = sse 来修复它。然后它的工作原理相同。

今天我在Debug模式下编译并运行游戏,并且第一次看到一些重放再次同步。当我搜索它时,它是由我在Release版本中使用的 -Ofast 标志引起的。因为 -Ofast 标志中包含 -ffast-math 。这在计算上有所不同,因此模拟也不同。

目前使用此 -Ofast 标志不会导致任何问题,因为每个人都在具有该标志的构建中播放。

将来我想将游戏移植到Mac,Linux,PS4,Xbox或其他东西。我的排行榜在我自己的服务器上,所以我想使用共享所有平台的相同排行榜。这就是为什么我需要游戏在每个平台上完全相同的原因。

我怀疑的是,如果我保持这个 -Ofast ,每个人都会玩它,当我需要将我的游戏移植到另一个平台时,我可能需要更改我的编译器,而编译器可能不会具有相同的标志,或者数学可能在该编译器中的工作方式不同。

我应该避免使用哪些标记以及应该选择哪些标记以确保它模拟相同的重播,每个平台都相同

修改:避免 -Ofast 摆脱 -ffast-math 听起来很明显,但我还应该使用其他什么呢?那之后呢?

1 个答案:

答案 0 :(得分:2)

这将很难实现。

当然,如果您的目标是32位和64位x86 / amd64架构,那么您希望将SSE用于两者,否则在32位x86上,最终可能会使用x87,这肯定会造成差异。

即使您可以解决自己编译的代码中的任何差异,您也可能会遇到标准库中的差异。例如,我在FreeBSD / Solaris和Linux之间遇到了std :: pow()实现的差异。

我认为使用定点表示是不可能的?