14

だから私は XNA 3.1 で何かを作っており、ピクセル シェーダーを介して適用される個別の効果がたくさんあります。これらは、特殊攻撃、環境など、あらゆる種類のソースから発生します。私が抱えている問題は、フレーム レートが大幅に低下していることです。

現在、シーン全体を RenderTarget2D に描画しており、これにすべての効果を適用しています。効果とその ID を含む SortedDictionary を保存し (ID は実行時にパラメーターを変更するために使用されます)、それを反復処理して、各効果を次々に適用します。

foreach(KeyValuePair<Ref<int>,Effect> p in renderEffects)
{
    Effect r = p.Value;
    g.SetRenderTarget(0, MainGame.MainRenderTarget);
    //Change RenderTarget to allow code to grab existing texture in the same draw area.
    levelDraw = MainGame.LevelRenderTarget.GetTexture();
    //Change back to draw back to this texture, allowing render effects to be layered.
    g.SetRenderTarget(0, MainGame.LevelRenderTarget);

    MainGame.StartDraw(MainGame.GameBatch);
    //Starts the sprite batch and sets some parameters
    r.Begin();
    r.CurrentTechnique.Passes[0].Begin();
    MainGame.GameBatch.Draw(levelDraw, new Rectangle(0, 0, levelDraw.Width, levelDraw.Height), Color.White);
    r.CurrentTechnique.Passes[0].End();
    r.End();
    MainGame.GameBatch.End();
}

現在、これにより、わずか 3 つの効果を重ねると顕著なフレーム ドロップが発生し、10 を適用すると 60FPS から 16FPS に低下しますが、これはもちろん容認できません。これを行うためのより効率的な方法があるかどうか疑問に思っています。テクスチャが 1 つしかないことを考えると、エフェクトを 1 つのファイルに結合し、テクスチャを取り戻さずに複数のパスを実行できる可能性があると考えました。ただし、これが可能かどうかはわかりません。

これを行うための最良の方法が正確にはわかりませんが、私がやっている方法よりも良い方法があるに違いないと思います。

4

2 に答える 2

2

スニペットのメソッドは非常に遅くなる可能性があります。これは、すべての効果に対してテクスチャ グラブと全画面描画を行っているためです。これにより、シェーダー内で何が起こっているかに加えて、CPU と GPU 間のメモリ帯域幅に負荷がかかります。投稿で提案したように、読み取りと書き込みのループを何度も実行するのではなく、それぞれに複数の操作を含む一連のシェーダーを作成する必要があるでしょう。通常、1 つの高価なシェーダーは、多くの読み取りと書き込みの繰り返しよりも高速です。単純なシェーダーの。

HLSL のシェーダー フラグメントに関する Shawn Hargreaves の記事、XNA でこれを行うための Tim Jones のコードを参照してください。

于 2012-12-30T08:40:39.133 に答える
1

描くときにすべてを完全にシェーディングしていますか? シェーダーの計算負荷が高い場合は、最初に「深度パス」を実行し、Z バッファーの ztesting/書き込みのみを行う必要があります (カラー バッファーの書き込みはオフです)。また、単純なシェーダーを使用して画面を「深度塗りつぶし」します。

つまり、すべての不透明なオブジェクトをレンダリングし、最初のパスで深度バッファーのみを更新します。

2 番目のパスでは、シェーダーをオンにします (そして深度書き込みをオフにします。帯域幅を使用して、既に存在する同じ値を書き戻す必要はありません)。これにより、オーバードローされたピクセルの不要な作業がすべてマスクされます。これは、深度テストにすぐに失敗するためです。

編集:OPがシーンレンダリングではなく、フルスクリーンエフェクトを実行していることに気付きました。

于 2012-12-22T03:03:22.537 に答える