Я хочу спросить, есть ли лучшая практика для настройки Effect
параметров в XNA. Или, другими словами, что именно происходит, когда я звоню pass.Apply()
. Я могу представить несколько сценариев:
- Каждый раз, когда
Apply
вызывается, все параметры эффекта передаются в графический процессор, и это не влияет на частоту установки параметра. - При каждом
Apply
вызове передаются только параметры, которые были сброшены. Поэтому следует избегать кэширования Set-операций, которые фактически не устанавливают новое значение. - При каждом
Apply
вызове передаются только измененные параметры. Так что кеширование Set-операций бесполезно. - Весь этот вопрос бесполезен, потому что ни один из упомянутых способов не оказывает сколько-нибудь заметного влияния на производительность игры.
Итак, последний вопрос: полезно ли реализовывать некоторое кэширование операции set, например:
private Matrix _world;
public Matrix World
{
get{ return _world; }
set
{
if (value == world) return;
_effect.Parameters["xWorld"].SetValue(value);
_world = value;
}
}
Благодарим вас заранее.
Ответы:
Все это происходит на стороне процессора, поэтому, если бы кэширование было полезной функцией, я бы предположил, что графический драйвер будет реализовывать ее сам. Добавление собственного слоя кэширования не требуется.
Насколько я понимаю, всякий раз, когда вы устанавливаете параметр и всякий раз, когда вы вызываете
Apply
, эти вызовы передаются в DirectX в основном как есть, и, в свою очередь, передаются драйверу графического пользовательского режима как есть. Затем драйвер пользовательского режима может делать все, что захочет . Все три ваших сценария возможны.(Поскольку сценарий № 2 возможен, вероятно, лучше не бегать намеренно, переустанавливая параметры, которые не меняются.)
Если честно, я не совсем уверен, что делает типичный водитель. Главным образом, потому что это никогда не возникает как проблема. Я никогда не слышал о том, чтобы кто-то имел настройку параметров эффекта как узкое место. Может быть, теоретически. Но есть еще много общих вещей, о которых нужно беспокоиться .
Конечно, не начинайте реализовывать оптимизацию, подобную этой, не измеряя свою производительность и не понимая, что происходит.
Кроме того, сравнение
Matrix
с==
плохим вуду. AMatrix
состоит изfloat
s, и сравнения равенства с плавающей точкой во многих случаях склонны к сбою.И, вообще говоря, картина
if(x != y) x = y;
медленнее, чем простоx = y
.источник
Одна интересная вещь, которую я нашел в этой теме.
Из MSDN:
и
Это означает, что
_effect.Parameters["xWorld"].SetValue(value);
это заметно медленнее, чемwordlParam.SetValue(value);
Таким образом, вы, вероятно, должны кэшировать такие параметры:
Но я не нашел никаких реальных ориентиров.
Источники:
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
источник