2013-06-17 14 views
7

Attualmente ho circa 15 passaggi di rendering nella mia pipeline. Per ogni passaggio, imposto le impostazioni corrette prima di disegnarle e reimpostarle in seguito. Tali impostazioni includono le dimensioni della finestra, il test di profondità attivato o disattivato, la funzione di fusione o disattivata, la funzione di stencil, l'operazione di stencil e altro.OpenGL impedisce chiamate API non necessarie?

Mi chiedo se OpenGL sia abbastanza intelligente da ignorare le chiamate API che impostano uno stato già presente. Perché altrimenti terrei traccia dello stato con un sacco di flag e prima di un passaggio di rendering impostare lo stato solo se è effettivamente necessario.

+0

Ho chiesto una domanda un po '"simile" relativa alle uniformi per GLSL: http://stackoverflow.com/questions/14724324/is-it-worth-caching-glsl-uniform-location-in-code. La risposta è stata anche "dipende dall'autista" :) – fen

risposta

7

La risposta breve: dipende dall'autista.

OpenGL non fa molto. Spetta ai venditori implementare le funzioni specificate dallo standard come meglio credono. Normalmente testano lo stato esistente per evitare uno stallo inutile della conduttura? Forse, ma a parte leggere consigli dai venditori o misurare le prestazioni da soli, non c'è modo di saperlo con certezza.

Il consenso del consiglio che ho visto (nessun riferimento per questo poiché è distribuito in tutto il luogo), è che si dovrebbe evitare di chiamare OpenGL con modifiche di stato ridondanti. Non può fare molto male e potrebbe fare del bene.

Nel tuo caso (cambiando stato alcune volte per fotogramma tra passaggi), probabilmente non farà molta differenza.

+2

Una risposta ancora più breve è: No. Quando il driver estrae il comando dalla coda e quindi ha la possibilità di ignorare le chiamate duplicate, _ hai già effettuato _ la chiamata API. Inoltre, lo stato dell'interrogazione di solito comporta lo stallo della pipeline, che è molto più costoso che impostarlo in modo ridondante. – Damon

+1

@Damon. Il driver non deve interrogare lo stato, potrebbe essere memorizzato nella cache in una variabile facilmente.Inoltre, quando assumiamo che gli sviluppatori di driver implementino questi test o che non abbiano senso, in entrambi i casi non ha senso per me implementarlo da solo. – danijar

+1

@danijar: Ci sono solo 2 cambiamenti di stato nella grafica che realmente compromettono le prestazioni: interruttori Texture e interruttori shader. Di solito si ordinano trame e shader prima del rendering, per questo motivo. – datenwolf

-1

molti di questi sembrano essere flag, e sarebbe probabilmente più costoso impostare un flag che testarlo e impostarlo. quindi la domanda sarebbe se OpenGL sia abbastanza stupido da farlo piuttosto che abbastanza intelligente.

per il resto dubito che il costo del calcolo, forse l'impostazione della matrice di trasformazione sarebbe significativo rispetto al lavoro di rendering effettivo, e di conseguenza non vale la pena ottimizzare a livello di libreria.

+0

Non fare tali ipotesi. Su molte architetture di memoria memorizzate nella cache, le scritture incondizionate devono essere copiate completamente indietro, ma una lettura/confronto/scrittura condizionale potrebbe evitare quella costosa restituzione. – MSalters

2

Perché altrimenti avrei tenere traccia dello stato con un sacco di bandiere e prima di un passaggio di rendering impostato solo lo Stato se è in realtà necessario.

Si prega di notare che questo potrebbe o potrebbe non essere più veloce di lasciarlo così com'è. OpenGL è, come altri hanno detto, solo una specifica API, lasciando l'implementazione ai fornitori di GPU (o comunità Open Source come Mesa). In generale, dovresti aspettarti che ogni chiamata produca dei risultati, ma se la tua preoccupazione principale sono le prestazioni, l'unico modo per scegliere davvero è profilatura.

Questi risultati possono variare da piattaforma a piattaforma o anche la versione di driver grafico, e talvolta tali insospettabili cose come il funzionamento a batteria. Fino a quando non misuri, non puoi dire quale sia un vero problema di prestazioni nella tua applicazione.