2016-09-21 18 views
0

コンパイルしたい比較的複雑なシェーダが1つあります。 シェイダーは〜3000行にコンパイルされた〜700行を持っています。HLSLコンパイル速度

コンパイル時間はfxc(Windows 8 SDK)で約90秒です。 同様のサイズの別のシェーダーがあり、コンパイル時間は20秒です。

だからここに私の質問は以下のとおりです。

  • は、アプリケーションの視点(FXCまたはFXCの代替の高速化バージョン)からコンパイルをスピードアップすることは可能ですか?
  • コンパイルをコードビューポイントから高速化することは可能です(コンパイルが大幅に遅くなるコード構成はどのように回避されますか?)。
  • fxc設定の観点からコンパイルを高速化することができます(いくつかの秘密のオプションは--fast-compileなど)?

編集:MSDNフォーラム上

パラレルスレッド:

https://social.msdn.microsoft.com/Forums/en-US/5e60c68e-8902-48d6-b497-e86ac4f2cfe7/hlsl-compilation-speed?forum=vclanguage

答えて

0

なぜシェーダのコンパイル時間が問題ですか? Fxcはオフラインコンパイラです。結果として得られるバイトコードはハードウェアに依存せず、アプリケーションと共に配布することができます。

開発中の反復時間を短縮する場合は、「/ Od」コマンドラインオプションを使用して最適化を無効にすると役立ちます。

+0

問題はもちろん開発です。コンパイルはincredibuildを使って比較的高速に行うことができますが、シェーダのリンクとコンパイルの2つの重要な部分があります。シェーダは共有されたC++ヘッダーから構成されるため、すべてのコードの更新によって新しいコンパイルが行われます。そして、それは迷惑です... – user4663214

1

「高速な」fxcまたはd3dコンパイルライブラリはありません。

ドライバーがdxbcから最終的なマイクロコードに至るまで最適化するため、速度を上げるためにさまざまなことが可能ですが、最適化をオフにすることもできます。

しかし、シェーダキャッシュを実装することをお勧めします。たとえば、シェーダファイルを前処理してハッシュし、実際には異なる場合にのみトリガを実行すると、時間が節約できます。

d3dcompileライブラリはマルチスレッドセーフであり、マルチコアCPUを利用したいと考えています。多くのシェーダをコンパイルする場合は、ファイルロードをキャッシュするインクルードインターフェイスを実装することも重要です。

最後に、すべてが失敗したときに、実験をして何が長くかかるかを見つけて、何度か書き直します。場合によっては、[branch]または[unroll]がコンパイル時間を解決するのに十分かもしれません。

+0

'[fastopt]'は私の経験上、ビルド時間を改善するために他のフラグより優れています。 –