Best practice per l'impostazione dei parametri degli effetti in XNA


13

Voglio chiedere se esiste una best practice per l'impostazione dei Effectparametri in XNA. O in altre parole, cosa succede esattamente quando chiamo pass.Apply(). Posso immaginare più scenari:

  1. Ogni volta che Applyviene chiamato, tutti i parametri degli effetti vengono trasferiti alla GPU e quindi non ha alcuna influenza reale sulla frequenza con cui imposto un parametro.
  2. Ogni volta che Applyviene chiamato, vengono trasferiti solo i parametri che sono stati ripristinati. Pertanto, è necessario evitare la memorizzazione nella cache di operazioni Set che in realtà non impostano un nuovo valore.
  3. Ogni volta che Applyviene chiamato, vengono trasferiti solo i parametri che sono stati modificati. Quindi la memorizzazione nella cache delle operazioni di set è inutile.
  4. Tutta questa domanda non è avviata perché nessuno dei modi menzionati ha un impatto notevole sulle prestazioni del gioco.

Quindi l'ultima domanda: è utile implementare un po 'di memorizzazione nella cache delle operazioni impostate come:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

Ringraziandoti in anticipo.


Ho aggiunto il tag DirectX, sulla base del fatto che si tratta di funzionalità di livello inferiore rispetto a XNA.
Andrew Russell,

Ho trovato la prova che l'argomento in questione è MOLTO praticabile. Sembra che se sei intelligente con il modo in cui imposti i parametri degli effetti, puoi aumentare il numero di chiamate di disegno (ovvero la velocità con cui vengono elaborate sulla CPU) più di due volte. Sono ancora in fase di test, puoi leggere la mia domanda qui: gamedev.stackexchange.com/questions/66932/…
cubrman

Risposte:


8

Tutto ciò accade sul lato CPU, quindi se la memorizzazione nella cache fosse una funzione utile, speculerei sul fatto che il driver grafico lo implementerebbe da solo. L'aggiunta del proprio livello di memorizzazione nella cache non è necessaria.

La mia comprensione è che ogni volta che si imposta un parametro e ogni volta che si chiama Apply, queste chiamate vengono passate a DirectX in gran parte così come sono e, a loro volta, passano al driver GPU in modalità utente così com'è. Il driver in modalità utente può quindi fare qualsiasi cosa diavolo voglia . Tutti e tre i tuoi scenari sono possibili.

(Poiché lo scenario n. 2 è una possibilità, probabilmente è meglio non aggirare deliberatamente i parametri che non cambiano.)

Ad essere sincero, non sono davvero sicuro di cosa faccia un tipico pilota. Soprattutto perché non è mai stato un vero problema. Non ho mai sentito parlare di qualcuno che ha impostato i parametri degli effetti come un collo di bottiglia. Forse potrebbe essere, in teoria. Ma ci sono molte altre cose comuni di cui preoccuparsi .

Certamente non iniziare a implementare ottimizzazioni come questa senza misurare le prestazioni e capire cosa sta succedendo.

Inoltre, confrontare un Matrixcon ==è un cattivo voodoo. A Matrixè composto da floats e i confronti di uguaglianza in virgola mobile sono inclini al fallimento in molti casi.

E, in generale, il modello if(x != y) x = y;è più lento del semplice x = y.


Punto interessante a cui dovrebbe interessare l'autista. Grazie per il collegamento (e i collegamenti nuovamente).
0xBADF00D

Di recente mi sono imbattuto nell'esempio di istanza della geometria da msdn . Il ripristino degli stessi rendering (con gli stessi valori) più volte per frame rallenta significativamente il processo di rendering di due o tre volte. Quindi il batch di stato è deferenzialmente utile. Sfortunatamente non sono sicuro del tempo che questa situazione si applica anche all'impostazione dei parametri dell'effetto. Ma vorrei condividere le mie informazioni.
0xBADF00D

4

Una cosa interessante che ho trovato su questo argomento.

Da msdn:

Puoi usare la proprietà Indicized Parameters su Effect per accedere a qualsiasi parametro effect, ma questo è più lento rispetto all'utilizzo di EffectParameters. Per questo motivo, dovresti creare un EffectParameter per ogni parametro di effetto che cambia frequentemente.

e

La creazione e l'assegnazione di un'istanza EffectParameter per ciascuna tecnica nel tuo Effect è notevolmente più veloce rispetto all'utilizzo della proprietà indicizzata Parametri su Effect.

Ciò significa che _effect.Parameters["xWorld"].SetValue(value); è notevolmente più lento diwordlParam.SetValue(value);

Quindi dovresti probabilmente memorizzare nella cache parametri come questo:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

Ma non ho trovato alcun benchmark reale.

fonti:

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


Ho appena testato questo sull'emulatore Monogame e WP - posso confermare che in effetti, c'è una differenza significativa (tra il 5-15% nel mio caso). Ci sono altri trucchi che aiutano nelle prestazioni?
Konrad,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.