0

透明度にも使用するため(アルファはフロートです)、浮動小数点値である粒子の寿命(粒子システムをシミュレートしています)のプロパティがあります。float から double への変換に関する質問を読み、それがかなりの問題であることに気付いたので、float を double に変換できない可能性があります。問題は、次のようなライフ変数から粒子のパスを計算しようとすることです。

particle.x += particle.xi;
particle.xi = Math.Sin(life);

注: ライフ値は最初は 1.0f で、0 まで減少します (<0.0f の場合、パーティクルを再初期化し、ライフを 1.0f に設定します)。
しかし、Sin は double 値を必要としています...そして、最初に戻ります。したがって、1つの解決策は、lifeプロパティのタイプをdoubleに変更することであり、透明性のためにそれを使用する場合、このdoubleはfloatに変換されますが、これは大きな問題にはなりません(私は推測します)。
しかし、私の質問は、それを行う他の方法があるかどうかです.doubleはより多くのメモリを必要とします(この場合、これ以上の意味はわかりません-倍になると思います.500個のパーティクルがあり、それぞれがこのプロパティがあります)。この float プロパティから何らかの方法で sin 値を計算する必要があります。

それで、それは可能ですか?記憶に関する私の懸念は重要ですか?

4

1 に答える 1

3

これはうまくいくはずです:

particle.x += particle.xi; 
particle.xi = (float) Math.Sin(life); 

「より多くのメモリを使用する」のではなく、再計算中に値を一時的に double に変換し、値を格納するときに float に変換し直します。

もう少し詳しく説明すると、Math.Sin には double が必要ですが、float はこの高い精度に損失なく変換できるため、「魔法のように機能する」だけです ( float から double への暗黙のキャスト)。ただし、結果の double を float に戻すには、数値の精度を下げることになるため、(これが受け入れられるかどうかはわかりません) 強制しない限り、コンパイラはそれを行いません ( (float)which は double から float への明示的なキャストです)

于 2012-05-30T23:18:16.627 に答える