我正在考虑用 C++ 编写多用户 RTS 游戏(部分)的可行性。我很快发现,一个硬性要求是游戏模拟必须完全确定服务器和所有客户端的最后一点,以便能够将网络通信限制为用户输入,而不是游戏状态本身. 由于每个人都有不同的计算机,这似乎是一个难题。
那么,是否有一些“神奇”的方法可以让 C++ 编译器创建一个在 Linux(服务器)、Windows 和 Mac 上完全确定的可执行文件?我认为两个主要的 OSS C++ 编译器是 GCC 和 Clang,所以我想知道在这方面是否一个比另一个表现更好。
我也会对任何可用于验证 C++ 确定性的测试套件感兴趣。
[编辑] 通过确定性,我的意思是编译后的程序,给定相同的初始状态,并以相同的顺序输入,将始终在它运行的任何平台上产生相同的输出。所以,也是跨网络。对我来说,一致听起来像是对这种行为的恰当定义,但我不是母语人士,所以我可能会误解确切的含义。
[EDIT#2] 虽然关于确定性/一致性是否重要的讨论,以及我是否应该在游戏引擎中以此为目标,以及它在 C++ 中通常有多大的问题,是非常有趣的,但它并没有以任何方式真正回答问题。到目前为止,没有人知道我是否应该使用 Clang 或 GCC 来获得最可靠/确定性/一致的结果。
[EDIT#3] 我突然想到有一种方法可以在 C++ 中获得与在 Java 中完全相同的结果。必须采用 JVM 的开源实现,并提取实现运算符和数学函数的代码。然后你把它变成一个独立的库,并在其中调用内联函数,而不是直接使用运算符。手工操作会很痛苦,但是如果生成代码,那么它是一个完美的解决方案。也许这甚至可以通过类和运算符重载来完成,所以它看起来也很自然。