2

ゲームエンジンのアニメーション更新機能と物理シミュレーションを別のスレッドに入れて実行しようとすると、ライタースレッド(アニメーション、物理)間のいくつかの浮動小数点値(オブジェクトの位置など)の潜在的な競合状態に気付きます。 )とリーダースレッド(レンダラー)(両方のスレッドが同時に値にアクセスする場合)。

私の質問は、浮動小数点の割り当てでさえアトミックではないことを考えると、そのような読み取り/書き込みの競合状態は、リーダーから見た元の滑らかに変化する値の有線/突然の変化をもたらす可能性がありますか?

さらに、私の状況では、そのようなエラーは次のレンダリングフレームに蓄積されないため、少量のエラーを許容できます。

4

3 に答える 3

1

私の理解では、一度にveriableをスレッドに書き込むだけで、読み取りスレッドが最新バージョンを使用していなくてもかまわない限り、競合状態は無視できます。

私の理解では、floatの記述はコードにとってアトミックである必要がありますが、これはプラットフォームに依存する可能性があると思います。

于 2010-02-26T07:23:14.090 に答える
1

ECMA-334(C#言語仕様)のセクション12.5には、次のように記載されています。

次のデータ型の読み取りと書き込みはアトミックである必要があります:bool、char、byte、sbyte、short、ushort、uint、int、float、および参照型。

そのためには、floatの読み取りと書き込みによる破損は見られないはずです(ここでdoubleを意味しないと仮定すると、アトミック書き込みであるとは限りません)。

ただし、値の書き込みはアトミックであることが保証されていますが、 Monitor.Enterの呼び出しなどの特定のものを使用しない限り、読み取り/書き込みの順序は保証されないことに注意してください。

ただし、Monitor.Enterはこれには少し重いので、変数を宣言するときにvolatileキーワードを使用することをお勧めします。この変数の読み取り/書き込みが発生する必要がある唯一のものであると仮定すると、読み取り/書き込みが順番に行われることが保証されます。

于 2010-02-26T07:31:32.933 に答える
0

理論的には、指数の更新と仮数の更新の間にコンテキストスイッチがあると、かなりのエラーが発生する可能性がありますが、現在使用されているほとんどのプラットフォームまたはアーキテクチャでそのようなことが起こるとは思えません。

于 2010-02-26T10:06:25.630 に答える