XNAで効果パラメーターを設定するためのベストプラクティス


13

EffectXNAでパラメーターを設定するためのベストプラクティスがあるかどうかを確認したいと思います。または、言い換えると、を呼び出すと正確に何が起こるのかpass.Apply()。複数のシナリオを想像できます。

  1. Apply呼び出されるたびに、すべてのエフェクトパラメーターがGPUに転送されるため、パラメーターを設定する頻度に実際の影響はありません。
  2. Apply呼び出されるたびに、リセットされたパラメーターのみが転送されます。したがって、新しい値を実際に設定しないSet-operationsのキャッシュは避けてください。
  3. Apply呼び出されるたびに、変更されたパラメーターのみが転送されます。したがって、セット操作のキャッシングは役に立たない。
  4. 言及された方法のいずれもゲームのパフォーマンスに顕著な影響を与えないため、この質問全体はブートレスです。

最後の質問です。次のような集合演算のキャッシュを実装することは有用ですか?

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

期待してありがとう。


これがXNAよりも低レベルの機能であることに基づいて、DirectXタグを追加しました。
アンドリューラッセル

私は、目前のトピックが非常に実行可能であるという証拠を見つけました。エフェクトパラメータの設定方法が賢明であれば、描画呼び出しの数(CPUでの処理速度)を2倍以上増やすことができるようです。私はこれをテストするプロセスではまだ午前、あなたがここに私の質問読むことができます: gamedev.stackexchange.com/questions/66932/...
cubrman

回答:


8

これはすべてCPU側で発生するため、キャッシュが便利な機能である場合、グラフィックドライバーがそれ自体を実装すると推測します。独自のキャッシュレイヤーを追加する必要はありません。

私の理解では、パラメーターを設定し、を呼び出すたびにApply、これらの呼び出しはほとんどそのままDirectXに渡され、ユーザーモードGPUドライバーにそのまま渡されます。ユーザーモードドライバーは、必要処理を実行できます。3つのシナリオすべてが可能です。

(シナリオ#2は可能性があるため、変更されないパラメーターを意図的に再設定しないでください。)

正直に言うと、私は典型的なドライバーが何をするのか本当に分かりません。主に、それが問題として実際に出てくることはないからです。ボトルネックとしてエフェクトパラメータ設定をしている人を聞いたことはありません。理論的にはそうかもしれません。しかし、心配することは非常に多くあります。

確かに、パフォーマンスを測定し、何が起こっているのか理解せずに、このような最適化の実装を開始しないでください。

また、比較Matrixには==悪いブードゥー教です。A Matrixfloatsで構成され、浮動小数点の等値比較は多くの場合失敗する傾向があります。

そして、一般的に言えば、パターンif(x != y) x = y;は単によりも遅いですx = y


ドライバーがこれを気にするべき興味深い点。リンク(および再リンク)をありがとう。
-0xBADF00D

私は最近、msdnからジオメトリのインスタンス化の例を見つけました。同じレンダーステート(同じ値)をフレームごとに複数回リセットすると、レンダリングプロセスが大幅に2〜3倍遅くなります。したがって、状態のバッチ処理は確実に役立ちます。残念ながら、この状況がエフェクトパラメータの設定にも当てはまるかどうかはわかりません。しかし、私は私の情報を共有したいと思います。
0xBADF00D

4

このトピックについて私が見つけた1つの興味深いこと。

msdnから:

EffectのParametersインデックス付きプロパティを使用して任意のエフェクトパラメーターにアクセスできますが、これはEffectParametersを使用するよりも時間がかかります。このため、頻繁に変化するエフェクトパラメーターごとにEffectParameterを作成する必要があります。

そして

Effectの各テクニックにEffectParameterインスタンスを作成して割り当てることは、Effect のParametersインデックス付きプロパティを使用するよりはるかに高速です。

それはそれ_effect.Parameters["xWorld"].SetValue(value);がよりも著しく遅いことを意味しますwordlParam.SetValue(value);

したがって、おそらく次のようなパラメーターをキャッシュする必要があります。

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

しかし、実際のベンチマークは見つかりませんでした。

ソース:

http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


MonogameとWPエミュレータでこれをテストしました。実際、大きな違いがあることを確認できます(私の場合は5〜15%)。パフォーマンスに役立つこのようなトリックはありますか?
コンラッド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.