マルチユーザー RTS ゲームを (部分的に) C++ でプログラミングする可能性を検討しています。私がすぐに発見したことは、1 つの厳しい要件は、ゲーム シミュレーションがサーバーとすべてのクライアント全体で最後のビットまで完全に決定論的でなければならないことであり、ネットワーク通信をゲームの状態自体ではなくユーザー入力に制限できるようにすることです。 . 誰もが異なるコンピューターを持っているため、これは難しい問題のように思えます。
では、Linux (サーバー)、Windows、および Mac で完全に決定論的な実行可能ファイルを C++ コンパイラに作成させる「魔法の」方法はありますか? 2 つの主な OSS C++ コンパイラは GCC と Clang だと思うので、この点で一方のパフォーマンスが他方より優れているかどうか疑問に思っていました。
また、C++ 決定論の検証に使用できるテスト スイートにも興味があります。
[編集] 決定論的とは、コンパイルされたプログラムが、同じ初期状態と同じ順序の入力を与えられた場合、それが実行されるどのプラットフォームでも、常に同じ出力を生成することを意味しました。したがって、ネットワーク全体でも。一貫性があるというのは、この動作の適切な定義のように思えますが、私はネイティブ スピーカーではないため、正確な意味を誤解する可能性があります。
[編集#2] 決定論/一貫性が重要かどうか、ゲーム エンジンでそれを目指すべきかどうか、C++ で一般的にどれほど大きな問題であるかについての議論は非常に興味深いものですが、実際には決して答えはありません。質問。これまでのところ、Clang と GCC のどちらを使用して最も信頼性が高く、決定論的で、一貫性のある結果を得る必要があるかを誰も教えてくれませんでした。
[編集#3] C++ で Java とまったく同じ結果を得る方法があることに気付きました。JVM のオープン ソース実装を使用して、演算子と数学関数を実装するコードを抽出する必要があります。次に、それをスタンドアロン ライブラリに変換し、演算子を直接使用する代わりに、その中でインライン化可能な関数を呼び出します。手作業で行うのは面倒ですが、コードが生成されれば完璧な解決策です。多分それはクラスと演算子のオーバーロードでもできるので、自然に見えます.