2012-04-29 13 views
2

私はC#SlimDX DX11レンダリングコードをすべて私のフォームから移動して以来、少し遅れています(はい、私は怠惰な開発者です)。特注クラス。私はEQATECプロファイラに私のプログラムをフラフラして、私の遅れへの主要な貢献者としてこれを得た:Swapchain.Present()が長すぎて遅れを引き起こしました

EQATEC Profiler results showing function postRender() to be at fault

を今ではpostRenderでどんなのが()本当に貴重なミリ秒を占有していることを、ここでは明らかです。実際、私がそこに持っているどんなクレイジーで複雑なコードでも、自分のフレームレートを〜15FPSまで効果的に減らすことができます。

だから、postRender()には何がありますか?コードは1行だけ:私はちょうどそれがそんなに遅くする原因何見当がつかない

swapChain.Present(0, PresentFlags.None); 

、私はすべてswapchainコードに変更を加えていませんでした。私が変更したのは画面解像度(1680x1050)ですが、これは絶対に良いはずです(このマシンは汗をかくことなくその解像度で最大限の設定でcrysis2を実行できます)。

誰でもスワップチェーンのプレゼンテーションに長い時間がかかり、次の問題を探す必要があると考えている人はいませんか?

EDIT:これらの機能のいくつかの結果は、前の機能に基づいている

preRender(); 
DeferredRender(preShader); 
//Composite scene to output image 
CompositeScene(compositeShader); 
//Post Process 
PostProcess(postProcShader); 
//Depth of Field 
DoF(dofShader); 
//Present the swapchain 
postRender(); 

(例えば次のように自分のコード、私のRenderFrame()関数の構造を見てみる

であります、DeferredRenderは4つのレンダリングターゲットを使用して、ピクセル単位で拡散照明、法線、位置および色を取得します。 DoFはPostProcessの結果を必要とします。したがって、唯一のシェーダSwapchain.Present()を保持している可能性があります。これは、関数DoFで実行されるシェーダでなければなりません。他のすべてのシェーダは、終了するまでCPUをロックさせます。正しい?

+0

問題の解決方法を見つけましたか? – Kayn

+0

@Kaynはい、私のシェイダーの1つは非常に非効率的で、それが現在のステップを握っていました。 –

答えて

1

Present()がフレーム内で多くの時間を費やしている理由はいくつかあります。現在の呼び出しは、CPUとGPU間の同期の主要な方法です。 CPUがGPUが処理できるよりもはるかに高速にフレームを生成している場合、それらはキューに入れられます。バッファがいっぱいになると、Present()は空になるのを待つ間、賞賛されるSleep()コールに変わります。

もちろん、あなたがここで示した小さな情報では言い表せません。マシンが稼動しているという理由だけで、あなたがカードで何かを投げ捨てることができなくなるわけではありません。奇妙な量のジオメトリをレンダリングすることを期待していないこと、シェーダが異常に長くて複雑ではないことを再度確認してください。

また、使用可能なGPUプロファイラの1つを使用してアプリを見てください。 PIXはベースポイントとして優れていますが、NVIDIAとAMDはそれぞれ固有の製品を独自に提供しています。最後に、ドライバが更新されていることを確認してください。運転手にバグがある場合は、問題について推論する機会があれば窓から出ます。

+0

更新いただきありがとうございます。限られた情報しか残っていないのは残念ですが、私は本当に何が関係しているのか、そうでないのかは分かりませんでした。画面の解像度が上がると遅れが顕著に悪化しますが、ジオメトリが増えると顕著に悪化することはありません。私はそれらを見て、私が掘り起こすことができるものを見ます。再び、多くのありがとう! –

+0

これはおそらくフィルレートバウンド処理を示しているでしょう。このような状況では、ピクセルシェーダを単純なバージョンに置き換えて試してみます。タイミングの違いによって、ボトルネックの可能性が明確に示されます。 – Ani

+0

ありがとう、私はシェイダーを見て、そのうちの1人は信じられないほど愚かで無駄なことをしていた、私が初めてそれを逃したとは信じられない。私はこの質問を答えにします。 –

関連する問題