B級科学者もどきの憂鬱

とある理系になりきれない奴のつれづれなる活動記

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DirectXは何故floatばかり使う?

もはや一月更新が板に付いてきました。
書く時間自体は多少あったのですが、
如何せん中々文章がまとまりませんでした。
結局3つぐらい下書き状態で放置です。
今回は、DirectXの話です。

DirectXのプログラムを書いていると、
座標などがほとんどfloatで扱われていることに気付きます。
何故、doubleを使わないでfloatなのでしょう?
CPUは大抵、doubleの方が計算速いのに……。
というわけで、ちょっと調べてみました。


まず一つ目の理由。それは、計算が速いからです。
あれ、さっきdoubleの方が計算速いとか言ってなかったっけ?
いえいえ、それはあくまでCPUの話です。

DirectXはグラフィックライブラリなので、
ほとんどの計算処理を行うのはGPUです。
そして、GPUは大抵floatの方が計算が速いのです。


二つ目の理由は、メモリ使用量が少ないからです。
まぁ、doubleに比べればサイズは半分ですからね。
ですが、単純にそれだけじゃありません。

DirectX7までは、3D頂点の情報を入れるための専用の構造体がありました。
これには普段使わないメンバも多かったので、メモリの無駄を省く為、
DirectX8からは、プログラマが必要なメンバだけを
定義した構造体が使えるようになりました。

DirectX側には、どんな風にメンバを宣言したかを伝えておけばOKです。
例えば、最初の12byteは、float型でx,y,z座標が入っている、
次の4byteに色の情報が入っている、などです。

ここで、頂点の座標等にfloatではなくdoubleを使うとどうなるでしょうか。
もし、doubleが頂点情報を格納する構造体にあると、
4byteのメンバと8byteのメンバが混在することになるので、
コンパイラにより、パディングが入ってしまう可能性があります。

そうなると、本来のメンバに必要な領域だけでなく、
一切使われない領域が出来てしまう、ということが有り得るのです。
メモリは出来る限り節約したいので、これは避けたいですよね。

つまり、頂点構造体のメンバを4byteに統一するために、
doubleではなくfloatを使っているわけです。
これならパディングは一切入りません。


二つ理由を紹介しました。
実際には、これらは相互に関連しているのでしょう。
floatがよく使われるから、GPUの計算もfloatの方を速くし、
計算が速いから、ますますfloatばかり使われる……と。
まぁこれは私の推測でしか無いですが。

ちなみに、最近はGPUで数値計算を行わせることも多いので、
double型などの計算もかなり速くなっているようです。
それでも、floatの方が数倍速いのですが。
スポンサーサイト

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。