0

私はただ尋ねたいのですが、整数は決定論的ですか? 当然のことですが、すべてのプラットフォームで同じですか?

Google で検索しましたが、返されたのは 2 つの数値を組み合わせる方法と、決定論に関する深い研究だけでした。

私が質問する理由は、ロックステップ ネットワーク モデルを特徴とする小規模なデモの開発を計画しているためです。コマンドを介して移動できる画面上にいくつかのブロックがあり、すべてのブロックに整数値を与えることを考えていました。

これはまた、浮動小数点数による非同期化に常に悩まされている一般的な RTS ゲームについても考えるようになりました (これが非同期化の唯一の理由ではありませんが、依然として非同期化の主要な要因です)。これらのゲームでは、すべてのユニット位置などを格納するために 64 ビット整数を使用しないのはなぜですか。ユニット位置などを処理するには、膨大な数の異なる値を格納できる容量を備えた 64 ビットで十分だと思います。

4

3 に答える 3

1

いくつかのまれな例外(たとえば、メモリアクセスのタイミング、およびのような明示的にランダムな操作RDRAND)を除いて、CPUでのすべての操作は、整数操作と浮動小数点操作の両方を含め、決定論的です。

ネットワーク化されたゲームの非同期は、アーキテクチャの問題ではなく、ゲームロジックのエラーの結果である傾向があります。

于 2013-03-04T18:13:11.163 に答える
1

ある程度。算術演算の結果は、どの演算もオーバーフローしない限り、常に同じになります。符号付き整数のオーバーフローの結果は未定義です。コンパイラーの最適化は、プログラムの同じ呼び出し内でも異なる結果をもたらす可能性があります。符号なしオーバーフローの結果は明確に定義されています。2つのプラットフォームのUINT_MAXの値が同じである限り、結果は常に同じになります。また、プラットフォームが使用する実際のバイナリ表現に依存することはできません。異なるマシン間で整数を渡したい場合は、何らかの形式のシリアル化を使用する必要があります。

于 2013-03-04T18:13:34.490 に答える
1

未定義の動作の重要なケースがいくつかあります。たとえば、式が範囲外の符号付き整数値を生成する場合は、中間ステップであっても、文字通り何でも起こり得ます。(また、「範囲外」はシステムに多少依存します。intたとえば、 は正確に 32 ビットであるとは限りません。) 実装定義の動作の場合もあります。たとえば、負の符号付き整数値の右シフトは実装定義です。つまり、コンパイラはそれを処理する方法を決定でき、その決定を文書化する必要があります。

そしてもちろん、マルチスレッドの場合、同期を適切に処理するように注意しない限り、ほとんどすべての賭けは無効になります。

しかし、これらのケースを回避すれば — 以外のプラットフォームは存在しませ2+24

于 2013-03-04T18:15:13.703 に答える