Chcę zapytać, czy istnieje najlepsza praktyka ustawiania Effect
parametrów w XNA. Innymi słowy, co dokładnie dzieje się, kiedy dzwonię pass.Apply()
. Mogę sobie wyobrazić wiele scenariuszy:
- Za każdym razem, gdy
Apply
wywoływane, wszystkie parametry efektu są przenoszone do GPU i dlatego nie ma rzeczywistego wpływu na to, jak często ustawiam parametr. - Przy każdym
Apply
wywołaniu przesyłane są tylko parametry, które zostały zresetowane. Dlatego należy unikać buforowania operacji Set, które tak naprawdę nie ustawiają nowej wartości. - Przy każdym
Apply
wywołaniu przesyłane są tylko zmienione parametry. Tak więc buforowanie Zestawów operacji jest bezużyteczne. - Całe to pytanie nie wymaga rozruchu, ponieważ żaden ze wspomnianych sposobów nie ma istotnego wpływu na wydajność gry.
Ostatnie pytanie: czy warto wdrożyć buforowanie operacji set, takie jak:
private Matrix _world;
public Matrix World
{
get{ return _world; }
set
{
if (value == world) return;
_effect.Parameters["xWorld"].SetValue(value);
_world = value;
}
}
Z góry dziękuję.
Odpowiedzi:
Wszystko to dzieje się po stronie procesora, więc jeśli buforowanie byłoby przydatną funkcją, to spekulowałbym, że sterownik grafiki sam by to zaimplementował. Dodanie własnej warstwy buforowania nie jest konieczne.
Rozumiem, że za każdym razem, gdy ustawia się parametr i za każdym razem, gdy wywołuje się
Apply
, te połączenia są przekazywane do DirectX w dużej mierze w stanie „jak jest”, a te z kolei są przekazywane do sterownika GPU w trybie użytkownika w stanie „jak jest”. Sterownik trybu użytkownika może wtedy robić, co tylko chce . Możliwe są wszystkie trzy twoje scenariusze.(Ponieważ możliwy jest scenariusz nr 2, prawdopodobnie najlepiej nie rozmyślnie zmieniać ustawień parametrów, które się nie zmieniają).
Szczerze mówiąc, nie jestem do końca pewien, co robi typowy kierowca. Głównie dlatego, że tak naprawdę nigdy nie stanowiło to problemu. Nigdy nie słyszałem o tym, żeby ktoś miał ustawienie parametru efektu jako wąskie gardło. Może teoretycznie może być. Ale jest o wiele więcej rzeczy, o które należy się martwić .
Z pewnością nie zacznij wdrażać takich optymalizacji bez mierzenia wydajności i zrozumienia, co się dzieje.
Również porównanie
Matrix
z==
jest złym voodoo. AMatrix
składa się zfloat
s, a zmiennoprzecinkowe porównania równości są podatne na awarie w wielu przypadkach.I ogólnie mówiąc, wzór
if(x != y) x = y;
jest wolniejszy niż po prostux = y
.źródło
Znalazłem jedną interesującą rzecz na ten temat.
Z msdn:
i
Oznacza to, że
_effect.Parameters["xWorld"].SetValue(value);
jest zauważalnie wolniejszy niżwordlParam.SetValue(value);
Prawdopodobnie powinieneś buforować takie parametry:
Ale nie znalazłem żadnych rzeczywistych testów porównawczych.
Źródła:
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
źródło