Quiero preguntar si hay una mejor práctica para configurar Effect
parámetros en XNA. O en otras palabras, qué sucede exactamente cuando llamo pass.Apply()
. Me puedo imaginar múltiples escenarios:
- Cada vez que
Apply
se llama, todos los parámetros de efectos se transfieren a la GPU y, por lo tanto, no tiene una influencia real con qué frecuencia configuro un parámetro. - Cada vez que
Apply
se llama, solo se transfieren los parámetros que se restablecieron. Por lo tanto, debe evitarse el almacenamiento en caché de las operaciones Set que realmente no establecen un nuevo valor. - Cada vez que
Apply
se llama, solo se transfieren los parámetros que se modificaron. Por lo tanto, el almacenamiento en caché de las operaciones Set es inútil - Toda esta pregunta no tiene arranque porque ninguna de las formas mencionadas tiene un impacto notable en el rendimiento del juego.
Entonces, la pregunta final: ¿es útil implementar algún almacenamiento en caché de la operación de configuración como:
private Matrix _world;
public Matrix World
{
get{ return _world; }
set
{
if (value == world) return;
_effect.Parameters["xWorld"].SetValue(value);
_world = value;
}
}
Agradeciendo de antemano.
Respuestas:
Todo esto sucede en el lado de la CPU, por lo que si el almacenamiento en caché fuera una característica útil, entonces especularía que el controlador de gráficos lo implementaría por sí mismo. Agregar su propia capa de almacenamiento en caché es innecesario.
Tengo entendido que cada vez que configura un parámetro, y cada vez que llama
Apply
, estas llamadas se transfieren a DirectX en su mayoría tal cual, y a su vez se transmiten al controlador de GPU en modo de usuario tal cual. El controlador de modo de usuario puede hacer lo que quiera . Los tres escenarios son posibles.(Debido a que el escenario # 2 es una posibilidad, probablemente sea mejor no correr deliberadamente reestableciendo parámetros que no cambian).
Para ser honesto, no estoy muy seguro de lo que hace un conductor típico. Principalmente porque nunca ha surgido como un problema. Nunca he oído hablar de alguien que tenga la configuración de parámetros de efecto como un cuello de botella. Tal vez podría ser, en teoría. Pero hay muchas cosas más comunes de las que preocuparse .
Ciertamente, no comience a implementar optimizaciones como esta sin medir su rendimiento y comprender lo que está sucediendo.
Además, comparar un
Matrix
con==
es un vudú malo. AMatrix
está formado porfloat
s, y las comparaciones de igualdad de punto flotante son propensas al fracaso en muchos casos.Y, en general, el patrón
if(x != y) x = y;
es más lento que simplementex = y
.fuente
Una cosa interesante que encontré sobre este tema.
De msdn:
y
Eso significa que
_effect.Parameters["xWorld"].SetValue(value);
es notablemente más lento quewordlParam.SetValue(value);
Entonces, probablemente debería almacenar en caché parámetros como este:
Pero no he encontrado ningún punto de referencia real.
Fuentes:
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
fuente