Bewährtes Verfahren zum Festlegen von Effektparametern in XNA

13

Ich möchte fragen, ob es eine bewährte Methode zum Festlegen von EffectParametern in XNA gibt. Oder mit anderen Worten, was genau passiert, wenn ich anrufe pass.Apply(). Ich kann mir mehrere Szenarien vorstellen:

  1. Bei jedem ApplyAufruf werden alle Effektparameter auf die GPU übertragen und daher hat es keinen wirklichen Einfluss darauf, wie oft ich einen Parameter einstelle.
  2. Bei jedem ApplyAufruf werden nur die zurückgesetzten Parameter übertragen. Das Zwischenspeichern von Set-Operationen, die keinen neuen Wert setzen, sollte daher vermieden werden.
  3. Bei jedem ApplyAufruf werden nur die geänderten Parameter übertragen. Das Cachen von Set-Operationen ist also nutzlos.
  4. Diese ganze Frage ist bootlos, da keiner der genannten Wege einen nennenswerten Einfluss auf die Spieleleistung hat.

Also die letzte Frage: Ist es nützlich, eine Zwischenspeicherung der Mengenoperation zu implementieren, wie:

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

Danke Ihnen im Voraus.

0xBADF00D
quelle
Ich habe das DirectX-Tag hinzugefügt, da dies eine niedrigere Funktionalität als XNA darstellt.
Andrew Russell
Ich habe Beweise dafür gefunden, dass das vorliegende Thema SEHR tragfähig ist. Wenn Sie mit der Einstellung Ihrer Effektparameter klug sind, können Sie die Anzahl der Zeichenaufrufe (dh die Geschwindigkeit, mit der sie in der CPU verarbeitet werden) mehr als zweimal erhöhen. : Ich bin immer noch dabei , dies zu testen, können Sie meine Frage hier lesen gamedev.stackexchange.com/questions/66932/...
cubrman

Antworten:

8

Dies alles geschieht auf der CPU-Seite. Wenn also Caching eine nützliche Funktion wäre, würde ich spekulieren, dass der Grafiktreiber es selbst implementieren würde. Das Hinzufügen einer eigenen Caching-Ebene ist nicht erforderlich.

Nach meinem Verständnis werden Applydiese Aufrufe bei jedem Festlegen eines Parameters und bei jedem Aufruf weitgehend unverändert an DirectX und anschließend unverändert an den GPU-Treiber im Benutzermodus weitergeleitet. Der Benutzer-Modus-Treiber kann dann tun, was zum Teufel es will . Alle drei Ihrer Szenarien sind möglich.

(Da Szenario 2 eine Möglichkeit darstellt, ist es wahrscheinlich am besten, nicht absichtlich Parameter zurückzusetzen, die sich nicht ändern.)

Um ehrlich zu sein, bin ich mir nicht sicher, was ein typischer Fahrer tut. Meistens, weil es nie wirklich zum Thema wurde. Ich habe noch nie von jemandem gehört, der die Einstellung von Effektparametern als Engpass betrachtet. Vielleicht könnte es theoretisch so sein. Aber es gibt noch so viele andere Dinge, über die man sich Sorgen machen muss .

Beginnen Sie auf keinen Fall mit der Implementierung solcher Optimierungen, ohne Ihre Leistung zu messen und zu verstehen, was los ist.

Auch ein Vergleich Matrixmit ==ist schlechtes Voodoo. A Matrixbesteht aus floats und Gleitkomma-Gleichheitsvergleiche sind in vielen Fällen fehleranfällig.

Und im Allgemeinen ist das Muster if(x != y) x = y;langsamer als einfach x = y.

Andrew Russell
quelle
Interessanter Punkt, dass sich der Fahrer darum kümmern sollte. Vielen Dank für den Link (und die erneuten Links).
0xBADF00D
Ich bin kürzlich auf das Beispiel der Geometrieinstanzung von msdn gestoßen . Das mehrfache Zurücksetzen derselben Renderstatus (mit denselben Werten) pro Frame verlangsamt den Rendervorgang erheblich um das Zwei- bis Dreifache. Daher ist State Batching äußerst nützlich. Leider bin ich mir nicht sicher, ob diese Situation auch für das Einstellen von Effektparametern gilt. Aber ich möchte meine Informationen teilen.
0xBADF00D
4

Eine interessante Sache fand ich zu diesem Thema.

Von msdn:

Sie können die indizierte Eigenschaft Parameters für Effect verwenden, um auf einen beliebigen Effektparameter zuzugreifen. Dies ist jedoch langsamer als die Verwendung von EffectParameters. Aus diesem Grund sollten Sie für jeden Effektparameter, der sich häufig ändert, einen EffectParameter erstellen.

und

Das Erstellen und Zuweisen einer EffectParameter-Instanz für jede Technik in Ihrem Effect ist erheblich schneller als die Verwendung der indizierten Eigenschaft Parameters für Effect.

Das heißt, das _effect.Parameters["xWorld"].SetValue(value);ist merklich langsamer alswordlParam.SetValue(value);

Daher sollten Sie Parameter wie folgt zwischenspeichern:

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

Aber ich habe keine tatsächlichen Benchmarks gefunden.

Quellen:

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

Zickzack-
quelle
Gerade auf Monogame und WP Emulator getestet - ich kann bestätigen, dass es tatsächlich einen signifikanten Unterschied gibt (zwischen 5-15% in meinem Fall). Gibt es noch weitere solche Tricks, die bei der Leistung helfen?
Konrad