2010-02-06 21 views
8

Devo pulire tutte le liste di visualizzazione, le trame, gli ombreggiatori (geometria) e così via a mano tramite le funzioni glDelete *, oppure il mem GPU viene liberato automaticamente quando il mio programma esce/si arresta?Pulitura memoria GPU OpenGL, richiesta?

Nota: GPU mem si riferisce alla memoria dedicata su una scheda grafica dedicata, non alla memoria della CPU.

+0

Dipende dalla definizione di "necessario". Non devi "fare" nulla. Se vuoi essere "corretto", sì; è necessario liberare sempre le risorse quando hai finito. – GManNickG

+0

Preferirei sapere se verrà ripristinata automaticamente, * poco dopo che il Programma si è chiuso, o se la memoria della GPU viene persa fino al prossimo riavvio. Speravo che qualcuno potesse indicarmi le specifiche OpenGL ed era stato definito lì (anche se il mio motore di ricerca preferito non mi ha sputato nulla di utile). – drahnr

+0

Entrambi! Davvero, ripulisci te stesso, anche se il sistema operativo lo fa per te. Non è necessario cancellare la memoria 'new'ed, il sistema operativo lo libererà appena termina il programma, ma non è qualcosa che suggerirei. –

risposta

13

Libera il contesto, tutto il resto è locale rispetto al contesto (a meno che tu non abbia abilitato la condivisione delle liste di visualizzazione) e se ne andrà con esso.

+0

Potrebbe essere utile commentare se wglDeleteContext non rilascia tutta la memoria? – SOUser

+0

@SOUser: hai abilitato la condivisione delle risorse tra i contesti? Quindi le risorse verranno liberate quando l'ultimo dei contesti collegati viene eliminato. Se si dispone di prove che l'eliminazione del contesto non sta ripulendo, presentare un bug con il driver GPU. –

1

Quando il programma termina (o si arresta in modo anomalo), qualsiasi memoria attualmente allocata deve essere liberata alla fine nello stesso modo in cui la memoria principale viene di solito liberata alla chiusura di un programma. Potrebbe passare del tempo prima che la GPU "realizzi" che la memoria è nuovamente disponibile per l'uso.

Tuttavia, non si deve fare affidamento su questo comportamento in quanto può dipendere da come sono stati implementati i driver della scheda grafica. È molto meglio effettuare esplicite operazioni di pulizia quando tu (come programmatore) sai che non avrai più bisogno di quella memoria.

1

Tutte le risorse GPU verranno rilasciate all'uscita del programma. Un modo semplice per testare è di non eliminare le cose ed eseguire ripetutamente l'app per vedere se fallisce l'allocazione dopo alcune iterazioni.

8

Come già menzionato, il proprio sistema operativo (in collaborazione con il gestore risorse del driver) dovrebbe rilasciare le risorse. Ecco a cosa servono i sistemi operativi. Vale la pena notare che questo non ha nulla a che fare con OpenGL, ma è qualcosa che fa parte della carta dei sistemi operativi ben funzionanti e dei relativi driver associati. Il sistema operativo è lì per gestire tutte le risorse di sistema. Quelli OpenGL sono solo un sottoinsieme di essi, e non sono diversi da, ad esempio, un handle di file. Ora per essere più concreti, dovresti specificare quale sistema operativo ti interessa.

BTW, È qui che faccio eccezione con la risposta di ChrisF. Non dovrebbe spettare all'autista decidere che è necessario eseguire la pulizia. I modelli di driver OS avranno un'interfaccia chiara tra il driver OpenGL in modalità utente (che non dovrebbe fare l'allocazione effettiva delle risorse gfx, poiché è condivisa nella macchina), il sistema operativo (che fornisce l'equivalente delle chiamate di sistema per allocare le risorse) e il driver in modalità kernel (che è semplicemente lì per eseguire gli ordini del sistema operativo in modo compatibile con gpu). Questo è almeno il caso dei modelli WIN2K e WDDM.

Quindi ... se il processo si blocca o termina in altro modo, in questi modelli, è responsabilità del sistema operativo chiamare il driver in modalità kernel per liberare tutte le risorse associate al processo.

Ora, se si o no è davvero qualcosa che è un po 'come chiedere tabs-o-spazi nel codice sorgente. Persone diverse hanno credenze diverse qui. "il sistema operativo lo farà comunque, smettere immediatamente è un'esperienza migliore per l'utente finale" vs "Voglio sapere se sto perdendo memoria perché se il mio programma è di lunga durata, davvero non voglio che colpisca gli errori di OOM Il modo migliore per farlo è quello di essere privo di perdite "sono le 2 linee principali di pensiero di cui sono a conoscenza.

+0

Penso di aver ottenuto il "perché" ... grazie per la tua risposta – drahnr

+0

Nota che stai contraddicendo te stesso. Sì, il sistema operativo invia un evento al driver quando è necessaria la pulizia ... ma è ancora il driver che esegue il lavoro effettivo e l'errore di pulizia è dovuto a un driver difettoso. –

+0

@BenVoigt: ho cercato di chiarire cosa intendevo. È meglio? – Bahbar

-1

In Opengl, non è presente memoria per memorizzare le informazioni sul disegno. qui, quando eseguiamo il programma opengl, quel tempo chiama il metodo draw frame chiamando in sequenza. Ad ogni modo, se disegniamo una linea o un cerchio significa, in qualsiasi momento, il suo metodo call draw call per disegnare in place.but specificato, ma opengl non memorizza quella linea in memoria. Ogni volta, solo il suo disegno. ma, quando abbiamo visto, quella linea è spuntata con successo.

Ex: In Android Opengl es2.0 ha utilizzato questa classe di rendering all'interno del metodo drawframe (metodo draw interno) per disegnare linee o cerchi, ecc. ho usato questo programma Opengl es2.0 nello sviluppo di app per Android Android. se vuoi cancellare le righe albeggiate usa questo metodo nella classe di rendering all'interno del metodo onDrawframe GLES20.glClearColor (0.0f, 0.0f, 0.0f, 1.0f); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT); GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

+0

Beh, ovviamente non memorizza nessuna geometria disegnata, ma memorizza un sacco di altre cose, sia nella CPU che nella memoria della GPU. Miglior esempio, dove viene disegnata la linea e perché la puoi vedere? –

+0

Ciao Christian Rau, hai ragione. Ho detto solo della memoria della GPU. Sto affrontando un problema per quanto sopra menzionato. per favore vedi questo link e se possibile per favore aiutami da questa lotta. http://stackoverflow.com/questions/17187032/why-my-opengl-output-differs-for-various-devices Si prega di consultare questo codice di esempio anche da questo link http://tuxbalaji.wordpress.com/2013/06/ 19/disegnare-a-line-con-opengles2-0-by-touch-evento-nel-android / – harikrishnan

Problemi correlati