むかしむかしに>が<よりも速いとき…ちょっと待って、何?


280

私は読んでいます 素晴らしいOpenGLチュートリアルをいます。それは本当に素晴らしいです、私を信頼してください。私が現在取り組んでいるトピックはZバッファです。それが何であるかを説明するだけでなく、著者は、GL_LESS、GL_ALWAYSなどのカスタム深度テストを実行できることを述べています。深度値の実際の意味(上と下ではない)も可能であることも説明しています。カスタマイズ。私はこれまで理解しました。そして、著者は信じられないようなことを言っています:

範囲zNearは、範囲zFarより大きくすることができます。そうである場合、ウィンドウ空間の値は、ビューアから最も近いまたは最も遠いものを構成するものに関して逆になります。

以前は、ウィンドウ空間のZ値0が最も近く、1が最も遠いと言われていました。ただし、クリップ空間のZ値を無効にすると、深度1はビューに最も近く、深度0は最も遠くなります。ただし、深度テストの方向を逆にしても(GL_LESSからGL_GREATERなど)、まったく同じ結果が得られます。だから、それは本当に単なる慣習です。実際、Zの符号と深度テストを反転させることは、かつて多くのゲームにとって重要なパフォーマンス最適化でした。

私が正しく理解していれば、パフォーマンスに関して、Zの符号と深度テストを反転させることは、<比較を比較に変更することに他なりません>。だから、私が正しく理解していて、作者が嘘をついていたり、物事を構成していなかったりした場合は、重要な最適化に変更<する>、多くのゲームでした。

著者は、物事を作っている私が何かを誤解していますか、それはかつての場合、確かである<(遅かった極めてよりも、著者が言うように、) >

このかなり興味深い問題を明確にしてくれてありがとう!

免責事項:アルゴリズムの複雑さが最適化の主な原因であることを十分に承知しています。さらに、今日は間違いなく何の違いもないだろうと私は疑っています。これを最適化するように求めているわけではありません。私は非常に、苦痛に、おそらく法外に好奇心が強いのです。


6
このチュートリアルへのリンクは、(最近)死んでしまったようです。:(
TZHX 2015年

@TZHX:承認された回答はチュートリアルの作成者が作成したものであるため、もう一度見つけたいと考えています。彼の回答に対する私の最後のコメントを参照してください:)
Armen Tsirunyan

3
参照されているOpenGLチュートリアルは、こちらから入手できます
2016年

(a <b)は(b> a)と同じなので、両方の比較操作をハードウェアで実装する必要はまったくありません。パフォーマンスの違いは、比較操作の結果として何が起こるかによるものです。これは、すべての副作用を説明するための長く曲がりくねった道ですが、ここにいくつかの指針があります。ゲームは深度バッファーを埋めるために使用され、深度テストに失敗したフラグメントのより高価なフラグメント処理を回避しました。ゲームは常に画面上のすべてのピクセルを埋めるため、Quakeは深度範囲を2つに分割してフレームバッファーをクリアしないようにしていました。
t0rakka

2
@Fonsは再びリンクが切れたように見えます:(
nalzok

回答:


350

私が正しく理解している場合、パフォーマンスに関して、Zの符号と深度テストを反転させることは、<比較を>比較に変更することに他なりません。したがって、私が正しく理解していて、作者が嘘をついていたり、作り直しをしていない場合、<を>に変更することは、多くのゲームにとって重要な最適化でした。

それは重要ではなかったので、私はそれを特によく説明しませんでした。ちょっとおもしろい雑学クイズだと感じました。具体的にアルゴリズムを検討するつもりはありませんでした。

ただし、コンテキストが重要です。<の比較が>の比較よりも速いと言ったことはありません。覚えておいてください。ここでは、CPUではなくグラフィックハードウェアの深度テストについて説明しています。ないoperator<

私が言及していたのは、1つのフレームをGL_LESS[0、0.5]の範囲で使用する特定の古い最適化でした 。次のフレームでGL_GREATERは、[1.0、0.5]の範囲でレンダリングします。文字通り「Zの符号を反転して深度テスト」をフレームごとに行ったり来たりします。

これは1ビットの深度精度を失いますが、深度バッファをクリアする必要はありませんでした。これは、かつてはかなり遅い操作でした。深度クリアリングは最近無料であるだけでなく、実際にはこの手法よりも高速なので、人々はもうそれをしていません。


1
デプスバッファーのクリアが最近の理由は2つあります。どちらも、GPUが階層型デプスバッファーを使用するという事実に基づいています。そのため、タイル状態をクリアに設定するだけでクリアできます(高速です)。ただし、深度比較記号を変更すると、比較記号に応じて最小値または最大値のみが格納されるため、HiZバッファー全体をフラッシュする必要があります。
Jasper Bekkers

3
@NicolBolas:PerTZHXのコメント、私の質問にあるチュートリアルへのリンクが無効になっています。チュートリアルをどこに移動し、必要に応じて質問を編集するか教えてください。
Armen Tsirunyan 2015年

2
チュートリアルはWebアーカイブから入手できます。@NicolBolasが許可する場合、よりアクセスしやすい場所に移動できると、コミュニティにとって役立ちます。多分GitHubか何か。web.archive.org/web/20150215073105/http://arcsynthesis.org/...
ApoorvaJ

3

答えはほぼ間違いなく、チップとドライバーの具体化が使用されたとしても、階層Zは一方向にしか機能しなかったということです。これは、当時はかなり一般的な問題でした。低レベルのアセンブリ/分岐はそれとは何の関係もありません-Zバッファリングは固定機能ハードウェアで行われ、パイプライン化されます-推測はなく、したがって分岐予測はありません。


0

このような最適化は、フレームバッファーの解決効率を低下させるため、多くの組み込みグラフィックスソリューションのパフォーマンスを低下させます。バッファのクリアは、ビニング時にバッファを保存して復元する必要がないことをドライバに知らせる明確な信号です。

背景情報がほとんどない:タイリング/ビニングラスタライザは、オンチップメモリ​​に収まる非常に小さなタイルの数で画面を処理します。これにより、外部メモリへの書き込みと読み取りが減り、メモリバス上のトラフィックが減ります。フレームが完了すると(スワップが呼び出されるか、FIFOがいっぱいになったためにFIFOがフラッシュされ、フレームバッファーのバインディングが変更されるなど)、フレームバッファーを解決する必要があります。つまり、すべてのビンが順番に処理されます。

ドライバーは、以前の内容を保持する必要があると想定する必要があります。保存とは、ビンが外部メモリに書き出され、その後、ビンが再度処理されるときに外部メモリから復元する必要があることを意味します。クリア操作は、ビンの内容が明確に定義されていることをドライバーに伝えます:クリアカラー。これは最適化が簡単な状況です。バッファの内容を「破棄」する拡張機能もあります。


-8

高度に調整されたアセンブリのフラグビットに関係しています。

x86にはjlとjgの両方の命令がありますが、ほとんどのRISCプロセッサにはjlとjzしかありません(jgはありません)。


2
それが答えである場合、それは新しい質問を提起します。初期のRISCプロセッサでは、「分岐が行われる」のが「分岐が無視される」よりも遅くなりましたか?私の知る限り、これは確かに現在、測定可能な方法ではありません。あなたforは無条件の後方分岐と条件付きのループを書いて、めったに前方に分岐してループを抜けることはなかったのでしょうか?不自然に聞こえます。
Pascal Cuoq

54
-1:この質問はCPUと関係ありません。GL_LESSとGL_GREATERは、GPUで実行される深度比較演算です。
Nicol Bolas、2011

8
タイトルに正解であるが実際の質問とはほとんど関係のない回答を得ることができる担当者の数。
Joshua

7
+1いいえ、この答えは質問の少なくとも一部に対して正しいです。問題は、「作成者は問題を修正しているか、何かを誤解しているか、または<が実際に>よりも(著者が言うように)遅くなっていたのか」です。与えられた3つのオプションがあります。この答えは、オプション3の可能性について答えています。この記事のどこにもCPU / GPUのテクノロジーが記載されておらず、GPU(CPU上の最初の3Dゲーム)である必要もありません。わかりました... RISCには多くの3Dゲームがなかったと思います:-)
xanatos

3
(GPUタグは20:34に追加されました。最初のリビジョンにはCPUタグしかありませんでした。この応答は18:44に書かれました)
xanatos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.