2016-08-02 5 views
7

通常のJavaScript関数を1秒間に何回呼び出すことができるかを数えることで、そのJavaScript関数をベンチマークすることができます。 WebGLでは、gl.drawArraysなどの関数は非同期なので、API呼び出しのベンチマークによってシェーダがかかる時間を測定することはできません。WebGLシェーダをどのようにベンチマークするのですか?

WebGL機能をベンチマークする方法はありますか?

答えて

3

シェイダーをベンチマークするのは非常に困難です。なぜなら、多量のコンテキストがあり、GPU固有のものであるからです。

あなたは1つのシェーダが前にして、gl.readPixelsを呼び出すことにより、GPUをストールというシェーダ(数千万人への描画呼び出し)で原料の束を描画した後performance.nowを使用して別のよりも高速である場合に伝えることができるかもしれません。どちらが速いかがわかります。 GPUの停止には開始時間と停止時間が含まれるため、どれくらい速いかはわかりません。

レースカーを考えてください。 dragsterのために、あなたはdestまで加速します。レースカーの場合は、1周をフルスピードで走ります。あなたはタイミングを取る前に車を1周前に走らせ、2周目にはスタートラインを横切ってフルスピードに、フィニッシュラインもフルスピードにする。だから、あなたは車のスピードを得ます。どこでドラフトターを加速するのですか(スピードを上げようとすると、GPUを起動して止めるべきではないのでGPUには一般的ではありません)。

スタート/ストップ時間に追加しない別の方法は、​​フレームの間に束を描くことです。フレーム間の時間がフレーム全体に跳ね上がるまで量を増やしてください。その後、シェーダ間の量を比較します。

実際の使用には他にも問題があります。例えば、タイル張りのGPU(多くのモバイルデバイス上のPowerVRのような)は、オーバードライブされるプリミティブの一部を取り除こうとします。だからタイル張られていないGPU上で大量のオーバードローを伴う重いシェーダは、タイル張りのGPU上ではかなり高速かもしれません。

また、正しいタイミングを取っていることを確認してください。頂点シェーダのタイミングを調整する場合は、おそらくキャンバスを1x1ピクセルにする必要があります。フラグメントシェーダはできるだけシンプルで、1回の描画呼び出しで多くの頂点を渡します(呼び出し時間を削除するため)。フラグメントシェーダのタイミングを決めているのであれば、大きなキャンバスといくつかのフルキャンバスクワッドを含む頂点のセットが必要になるでしょう。

また、おそらくいくつかのGPUベンダー固有のツールなしで正確なシェーダーの実行時間を取得する方法はありませんWebGL/OpenGL: comparing the performance

2

を参照してください。しかし、gmanの提案に加えて、EXT_disjoint_timer_query拡張機能があり、描画呼び出しの実行時間を測定できます。これは、シェーダの実行時間に大きく依存します(特に、シェイダーがかなり重い場合)。コールを呼び出す)。

+0

'EXT_disjoint_timer_query'は、PowerVR(iOS)のようなタイル型のアーキテクチャで有用な情報を提供しません。なぜなら、遅延レンダラを使うからです。できるだけ多くのポリゴンが分割された後、タイルでは、オクルージョンがクリップされ、レンダリングされたタイルはすべてレンダリングされます。https://imgtec.com/blog/a-look-at-the-powervr-graphics-architecture-tile-based-rendering/ – gman

+0

@gmanはい。しかし、** shader **のベンチマークについて話しています。状況は、TBDRに人生を不安にさせる機会として与えられ、したがっていくらか適切な結果を得る。私はここで間違っていますか?その仮定を決してテストしなかった。 –

+0

しかし、あなたはできますか?ブレンドをオンにしている限り、少なくとも1つのシェーダが別のシェーダより高速かどうかを知ることができます。ブレンドすると、すべてのあなたのオーバードローが処分されます。あなたが戻ってくる時間は、ポリゴン分割、タイルバケット化などすべてを含んでいることを覚えておく必要があります。シェーダの時間だけではありません。私は、拡張がタイル構造にも存在し、実際にそれが返ってくるものと仮定しています。 – gman

関連する問題