Je veux demander s'il existe une meilleure pratique pour définir les Effect
paramètres dans XNA. Ou en d'autres termes, que se passe-t-il exactement lorsque j'appelle pass.Apply()
. Je peux imaginer plusieurs scénarios:
- Chaque fois que vous
Apply
appelez, tous les paramètres d'effet sont transférés vers le GPU et il n'a donc aucune influence réelle sur la fréquence à laquelle je règle un paramètre. - À chaque
Apply
appel, seuls les paramètres réinitialisés sont transférés. Il faut donc éviter la mise en cache des opérations Set qui ne définissent pas réellement de nouvelle valeur. - A chaque
Apply
appel, seuls les paramètres modifiés sont transférés. La mise en cache des opérations Set est donc inutile. - Toute cette question est sans démarrage car aucun des moyens mentionnés n'a un impact notable sur les performances du jeu.
Donc, la dernière question: est-il utile d'implémenter une mise en cache de l'opération d'ensemble comme:
private Matrix _world;
public Matrix World
{
get{ return _world; }
set
{
if (value == world) return;
_effect.Parameters["xWorld"].SetValue(value);
_world = value;
}
}
Merci d'avance.
Réponses:
Tout cela se produit du côté du processeur, donc si la mise en cache était une fonctionnalité utile, je suppose que le pilote graphique l'implémenterait lui-même. L'ajout de votre propre couche de mise en cache n'est pas nécessaire.
D'après ce que je comprends, chaque fois que vous définissez un paramètre et chaque fois que vous appelez
Apply
, ces appels sont transmis à DirectX en grande partie tels quels, et à leur tour transmis au pilote de GPU en mode utilisateur tel quel . Le pilote en mode utilisateur peut alors faire ce qu'il veut . Vos trois scénarios sont possibles.(Parce que le scénario # 2 est une possibilité, il est probablement préférable de ne pas contourner délibérément les paramètres qui ne changent pas.)
Pour être honnête, je ne suis pas vraiment sûr de ce que fait un conducteur typique. Surtout parce que ce n'est jamais vraiment un problème. Je n'ai jamais entendu parler de quelqu'un ayant le réglage des paramètres d'effet comme goulot d'étranglement. Peut-être que ça pourrait l'être, en théorie. Mais il y a tellement de choses plus communes à se soucier .
Ne commencez certainement pas à implémenter de telles optimisations sans mesurer vos performances et comprendre ce qui se passe.
De plus, comparer un
Matrix
avec==
est un mauvais vaudou. AMatrix
est composé defloat
s, et les comparaisons d'égalité à virgule flottante sont sujettes à l'échec dans de nombreux cas.Et, d'une manière générale, le modèle
if(x != y) x = y;
est plus lent que simplementx = y
.la source
Une chose intéressante que j'ai trouvée sur ce sujet.
De msdn:
et
Cela signifie que
_effect.Parameters["xWorld"].SetValue(value);
c'est nettement plus lent quewordlParam.SetValue(value);
Vous devez donc probablement mettre en cache des paramètres comme celui-ci:
Mais je n'ai trouvé aucun repère réel.
Sources:
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
la source