Unrealでは、C ++のfloatとFFloat32の違いは何ですか?


17

私はUE4のより深い側面を学ぼうとしていますが、多くのサンプルコードとエンジンのソースベースを読んでいると、人々(およびソースコード)が標準のC ++ floatプリミティブを使用するが、UE4のカスタム実装を使用することがあることに気付きましたFFloat32

その後、私は好奇心が強くなりました:Unrealでゲームをプログラミングするとき、これら2つのオプションを使用することの違いは何ですか?また、エンジンの実装を支持して標準C ++プリミティブをドロップすべき主なケースは何ですか?


1
あなたが実際に使用しているのを見つけた例を読むことに興味があるでしょうFFloat32

@JoshPetrieそれらのいくつかはオフラインで、カップルはオンラインでした。私は自宅で時間があるとすぐに、私は共有に彼らのために検索します
キム・シャッター

回答:


17

float、まあ、C ++浮動小数点です。FFloat32は、フロートと、そのフロートの符号、仮数部、および指数部の分解されたビットフィールドを(結合を介して)表す構造です。

通常、次の場合を除いて使用しないでくださいFFloat32

  • あなたは期待するいくつかのAPIを使用しているFFloat32(これらは非常にまれである)、または
  • 浮動小数点値を使用して何らかの低レベルのビットハッカーを実行する必要があります(最近はかなりまれです)

それFFloat32悪いことではありません、それ自体、汎用浮動小数点の使用に必要なものを実際に提供しないというだけです。

単純なoldよりも一般的ではfloatありませんが、読みやすさの面で若干の影響があります(他の人は一目でそれが何であるかすぐには分からないかもしれません)。また、暗黙的に変換されfloatないためsomething.FloatValue、大量に入力することになります。これも大したことではありませんが、退屈になる可能性があります。

最後に、共用体とビットフィールドの使用は移植性がなく、実装によって定義されます(以下を参照)。これはあなたの問題ではありませんサポートされているすべての実装で使用できるように型が構造化されていることを確認するのはEpicの仕事ですが、新しいコンパイラーで型の実装の問題をキャッチできない場合、潜在的なバグの原因になりますバージョンがリリースされるか、サポートされているコンパイラのリストに追加されます。

したがって、浮動小数点表現の個々のビットを使用する必要がない限り、おそらく避ける必要がありますFFloat32FFloat16標準の16ビットC ++浮動小数点型が存在しないため、そのいとこ、がわずかに有用である場合があります)。

speed」のために、コンポーネントの整数表現を介してフロートを操作するのが一般的でした。現代のコンピューターは、多くのプラットフォームの必要性の多くを取り除き、この種のことを行うために使用できるさまざまなタイプパニングのテクニックは、実際にはどんなイベントでもパフォーマンスや正確さを損なう可能性があります。

UnrealのGitHubリポジトリを検索すると、このFFloat32タイプの使用法がほとんどないことがわかるはずです。それらのすべては FFloat32それ自身の定義かの定義にありFFloat16ます。


具体的にFFloat32は、C ++標準が呼び出す2つのことを行います。それ:

  • ユニオンの複数のメンバーが同時にアクティブであるかのように動作できます。浮動小数点メンバーに書き込み、整数メンバーの1つから読み取ることが期待されています(9.5.1、[class.union])
  • ユニオン内のビットフィールドの割り当てが、IEEE浮動小数点値のビット割り当ての割り当てと一致することを期待します。ただし、クラス型内のビットフィールドメンバーの割り当てとアライメントは実装定義です(9.6.1、[class.bit])

Unrealは標準C ++で書かれておらず、書かれている特定のコンパイラー向けに書かれています。
user253751

私は、彼らがIEEE標準で定義されているので、これらのビットフィールドは、標準のC / C ++に非常にポータブルでもあることを期待する、とのために異なるレイアウトを使用して、任意のコンパイラはfloatなるだろうではないIEEE 754に準拠し、既存のソフトウェアの多くと赤いマーク(と互換性のトラブルを)。
ドミトリーグリゴリエフ

3
(pedantic)問題は、それらのビットフィールドの記述順序がIEEE標準と一致する可能性があるが、C ++コンパイラはそれらを再配列または再整列する可能性があることです。これは小さな脚注に過ぎませんが、それを扱うのはEpicの仕事です。新しいコンパイラの各バージョンを監視して、型が正しく機能することを確認する必要があります。

@JoshPetrieポイントを取得、説明ありがとう。
ドミトリーグリゴリエフ

1
@JustinLardinoisただし、FFloat32 floatにはユニオンのメンバーが含まれているため、float実際には32ビットよりも大きい場合FFloat32、ユニオンは最大のメンバーを保持するのに十分な大きさでなければならないため、全体も同様になります。フロートが4バイトより大きい場合、Epicはユニオンのビットフィールド部分も修正する必要があります。そうしないと、完全なフロートをマップしません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.