2011-09-07 14 views
5

Ho eseguito lo strumento di analisi ES OpenGL da Instruments nella mia app e ho dichiarato che dopo aver compilato lo shader, dovrei effettuare una chiamata a glDrawArrays in una passata di pre-riscaldamento. Quindi ho controllato l'ora di alcuni shader che ho scritto, e in effetti la prima volta che il programma viene eseguito è molto più lento.Come correggere il ritardo nel primo utilizzo di uno shader?

Nel mio codice ho un caricatore di shader generico, che non conosce le uniformi/attributi dello shader, lo compila semplicemente. E sembra che il posto migliore per prewarmare lo shader sia lì (quindi non ho bisogno di aggiungere glDrawArrays ovunque). Ho provato l'aggiunta di questo nel mio Shader caricatore:

glUseProgram(prog); 
glDrawArrays(GL_TRIANGLES, 0, 0); 

E 'fissato il ritardo, ma dal momento che non sto impostando qualsiasi uniformi/attributi non sono sicuro se è sicuro. Inoltre sembra in qualche modo una soluzione alternativa. Qual è il modo migliore per pre-riscaldare il programma?

risposta

2

il tuo codice è (quasi) perfettamente sicuro. Le uniformi non sono un problema poiché contengono alcuni valori predefiniti. Per quanto riguarda gli attributi, non è un problema perché non stai emettendo alcun vertice.

D'altra parte, questo potrebbe essere il modo più semplice per preriscaldare gli shader, ma potrebbe non essere il migliore. Una tecnica simile è stata utilizzata di volta in volta per trame di preriscaldamento (per riempire la cache delle texture). Di solito veniva eseguito eseguendo il rendering di alcuni fotogrammi senza visualizzare l'output. Questo è stato visto ad esempio in Unreal Tournament, ha mostrato "Precaching" per un breve periodo dopo aver caricato il livello. Suggerirei di fare lo stesso.

+0

Un'eccellente informazione, anche se questa è la prima volta che leggo degli ombreggiatori pre-riscaldamento. Hai qualche letteratura su questo? Sarebbe molto utile. Cheers –

+0

Bene, perché tutti i dettagli dell'implementazione relativi alla GPU sono specifici del fornitore e per lo più riservati, direi che non ci sono informazioni solide su questo (perché nessuno lo sa e cambia sempre). Ma i concetti rimangono gli stessi, se c'è una risorsa che viene memorizzata nella cache o caricata pigramente, è sufficiente eseguire alcuni frame per riempire la cache e far caricare la risorsa. Non c'è molto altro ... –

Problemi correlati