モバイルゲームを作成するときに浮動小数点数または倍精度浮動小数点数を使用する


8

シェーダーの場合、フロートはパフォーマンスにとって最適な選択肢であるため、フロートを使用する必要があります。ダブルスは遅く、より多くのメモリを使用するため、シェーダーには理想的ではありません。フロートは精度が低く、フロートオーバーフローになる傾向がありますが、速度のトレードオフはモバイルハードウェアで理想的です。

しかし、シェーダーパイプラインに関連しないコードベースの他の場所についてはどうでしょうか。私はエンジンを作成していて、デルタ更新ティックにdoubleを使用し、すべてのユニットをそのデータ型に相対的に保つようにして、doubleを使用する場所がたくさんあるようにします。エンジンのモバイルでもフロートを使用する必要がありますか?

エンジンはC ++言語で記述されています


使用している言語に大きく依存すると思います。
DJ Spicy Deluxe

説明にC ++を追加
Dan

回答:


14

あなたが望んでも倍精度を使用できるモバイルGPUを見つけるのは難しいので、選択の一部はほとんどあなたのために作られています。

ゲームで単精度浮動小数点数から切り替えるとメリットが得られる場所はほんのわずかです。

これらは、カバーする必要のある範囲でかなりの精度を失うため、単精度のフロートに格納してはならない最も一般的な2つの例です(ゲームの最初の1秒では、経過時間を表すことができます)時間内に 224 秒、または数十ナノ秒ですが、2.5時間後、ミリ秒の精度が失われ始めます)

ただし、必ずしもdoubleを使用する必要があるという意味ではありません。整数型はこれらの値を問題なく処理できます。(32ビットintは、12日間の連続再生でミリ秒の精度を提供します。64ビットintは数百万年持続します)

デルタ時間値は、単精度浮動小数点に格納する程度にあなたの精度を提供しますので、通常は、16ミリ秒のオーダーであります229日s、これはまだナノ秒のレベルまで下がっています—つまり とにかく、コードのタイミングを確実に計り、スレッドに信号を送ったり、グラフィックスの更新を調整したりできる精度をはるかに超えています。ここでdoubleを使用して精度を高めても、測定可能な方法でゲームを改善することはできません。

したがって、合計経過時間を高精度で格納するか、整数型を使用して、デルタを計算し、フレームごとに1回単精度浮動小数点数に変換してから、そこから浮動小数点数をうまく使用できます。

ポジションについても同様です。巨大な世界であっても、それを数km以下のチャンクに分割した場合、単精度フロートは、親チャンクに対して1ミリメートル未満の精度で位置を特定できます

オブジェクト間の相対的なオフセット(見出しなどを計算するため)は、通常、非常に遠く離れていても、フロートに格納するには問題ありません。ベクトルの全長と比較した場合の相対的な誤差は、制御された範囲内に留まります。

したがって、デフォルトとしてdoubleを使用する理由はあまりありません。フロートの精度を計算した非常に特別なニーズがある場合にのみ、フロートの精度が低下せず、倍精度浮動小数点数の使用をゲームの積極的に必要とする部分にのみ保持することを検討します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.