2016-10-17 1 views
1

私は、ユニティーが浮動小数点でフードの下で最適化を行う場合、誰もが頭の上を知っていたのだろうかと思っていました。unity3Dはいつでもフロートを最適化しますか?

ので、基本的に、それ自体で、最適化の一種である代わりに、小数の山車を、使用されるが、彼らはまだに使用することができますulongの倍の資源だと思われるので、C#math機能をラップ自分mathf機能値を格納し、次に10の係数で除算します。

フレームごとに数百から数千の浮動小数点数を扱っている物理計算を作成すると、私たちが得ることのできるすべてのオプションがほしいと思うようです。

私はリンクを提供するポインタを使用したいと言われていますが、私は安全でないで実行中に販売されていません。

http://answers.unity3d.com/questions/804103/how-to-enable-unsafe-and-use-pointers.html

+0

実際にC#の数学関数をラッピングしているかどうかはわかりません。彼らはモノCLRで独自のネイティブ実装を行い、 'MathF'がそれらの1つであれば驚くことはありません。 –

+0

また、コードをプロファイルして、 'MathF'関数が実際にどこのコードを使っていたのか、それとも最も時間を費やしていると仮定しているのかが分かりましたか? –

+1

10進数でfloatを使用していますか?確かに?二重ではない?ストレージの乗算とその値を取得するための除算が必要な場合、なぜulongを最適化するのでしょうか?ポインタがより速くなると思うのはなぜですか?値の周りを渡すため?まだ4バイトのデータ。そして、あなたはまだアクションを実行するためにレジスタに値を配置する必要があります。あなたが考えている解決策に問題を見つけようとしているかもしれません。 – Everts

答えて

1

バイト(8ビット)、ショート(16ビット)、INT(32ビット)、ロング(64ビット)と小数(128ビット)は、(正確です32- bit)とDouble(64-bit)はそうではありません。浮動小数点の利点は、それらが高いレンジを持つことですが、それは精度を犠牲にしています。

ゼロに近い高い精度と高い数値で精度が向上します。自分のプロジェクトでUnityと行ったテストでは、1 000メートル後に既に1メートルのグリッド内に物事を置くことができない場合がありました.1メートルをスキップします。

ほとんどのグラフィックスカードとそのAPIは、32ビット浮動小数点データ型を使用します。これは、メモリ(および処理能力はあまり高くないものの一部)と精度との間のトレードオフです。したがって、ユニティもフロートを使用することは意味があります。いくつかの商用カードはsupport for 16-bit and 64-bit floating pointsになっています。

Unityはフロート自体を最適化しません。ほとんどの場合、生の状態でGPUに渡します。これが最も最適化された方法です。

MathfでMathをラップする方法は、おそらく混乱(メソッドシグニチャ)を避け、Mathクラスを適切に拡張できるようにすることです。

大きな欠点の1つの例:私のゲームはほぼ無限の世界を持っているため、「Futurama Engine」が必要です。これは、毎回0,0,0と世界に応じてプレーヤーを調整し、浮動小数点ではオブジェクトの高さ/高さが低くなるのを防ぎます。 "エンジンは船をまったく動かすことはありません。船はどこにでもあり、エンジンはその周りの宇宙を動かします。"ユニティとグラフィックスカードでDecimalを使用した場合、これは必要ありません。

0

注意:

フロートは32ビットであり、ダブルスは64ビットであり、小数は128ビットです。したがって、ulongは浮動小数点の2倍のサイズで、小数点以下2桁と同じサイズです。フロートながら

-Scott Chamberlain 
関連する問題