Ich möchte fragen, ob es eine bewährte Methode zum Festlegen von Effect
Parametern in XNA gibt. Oder mit anderen Worten, was genau passiert, wenn ich anrufe pass.Apply()
. Ich kann mir mehrere Szenarien vorstellen:
- Bei jedem
Apply
Aufruf werden alle Effektparameter auf die GPU übertragen und daher hat es keinen wirklichen Einfluss darauf, wie oft ich einen Parameter einstelle. - Bei jedem
Apply
Aufruf werden nur die zurückgesetzten Parameter übertragen. Das Zwischenspeichern von Set-Operationen, die keinen neuen Wert setzen, sollte daher vermieden werden. - Bei jedem
Apply
Aufruf werden nur die geänderten Parameter übertragen. Das Cachen von Set-Operationen ist also nutzlos. - 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.
Antworten:
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
Apply
diese 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
Matrix
mit==
ist schlechtes Voodoo. AMatrix
besteht ausfloat
s und Gleitkomma-Gleichheitsvergleiche sind in vielen Fällen fehleranfällig.Und im Allgemeinen ist das Muster
if(x != y) x = y;
langsamer als einfachx = y
.quelle
Eine interessante Sache fand ich zu diesem Thema.
Von msdn:
und
Das heißt, das
_effect.Parameters["xWorld"].SetValue(value);
ist merklich langsamer alswordlParam.SetValue(value);
Daher sollten Sie Parameter wie folgt zwischenspeichern:
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
quelle