私はC#SlimDX DX11レンダリングコードをすべて私のフォームから移動して以来、少し遅れています(はい、私は怠惰な開発者です)。特注クラス。私はEQATECプロファイラに私のプログラムをフラフラして、私の遅れへの主要な貢献者としてこれを得た:Swapchain.Present()が長すぎて遅れを引き起こしました
を今では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をロックさせます。正しい?
問題の解決方法を見つけましたか? – Kayn
@Kaynはい、私のシェイダーの1つは非常に非効率的で、それが現在のステップを握っていました。 –