OpenGL GPU Speicherbereinigung, erforderlich?

8

Muss ich alle DisplayLists, Texturen, (Geometry-) Shader usw. per Hand über die glDelete * -Funktionen aufräumen, oder wird der GPU-Speicher automatisch freigegeben, wenn mein Programm beendet wird / abstürzt?

Hinweis: GPU-Speicher bezieht sich auf dedizierten Speicher auf einer dedizierten Grafikkarte, nicht auf CPU-Speicher.

    
drahnr 06.02.2010, 23:04
quelle

5 Antworten

13

Geben Sie den Kontext frei, alles andere ist lokal für den Kontext (sofern Sie nicht die gemeinsame Nutzung von Displaylisten aktiviert haben) und wird damit fortgehen.

    
Ben Voigt 15.02.2010, 04:12
quelle
8

Wie bereits erwähnt, sollte Ihr Betriebssystem (in Zusammenarbeit mit dem Treiberressourcen-Manager) die Ressourcen freigeben. Dafür gibt es Betriebssysteme. Es ist erwähnenswert, dass dies nichts mit OpenGL zu tun hat, aber es ist etwas, das Teil der Charta von gut erzogenen Betriebssystemen und ihren zugehörigen Treibern ist. Das Betriebssystem ist dazu da, alle Systemressourcen zu verwalten. OpenGL-Dateien sind nur eine Teilmenge von ihnen, und sie unterscheiden sich nicht von einem Dateihandle. Um konkreter zu werden, sollten Sie angeben, welches Betriebssystem Ihnen wichtig ist.

BTW, das ist, wo ich Ausnahme mit der Antwort von ChrisF nehme. Es sollte nicht Sache des Fahrers sein, zu entscheiden, ob eine Bereinigung erforderlich ist. OS-Treibermodelle haben eine klare Schnittstelle zwischen dem OpenGL-Treiber im Benutzermodus (der eigentlich keine gfx-Ressourcenzuteilung durchführen sollte, da er auf dem Rechner freigegeben ist), dem Betriebssystem (das den Systemaufrufen entspricht) und dem Kernel-Mode-Treiber (der nur dazu dient, die OS-Befehle in einer Weise auszuführen, die mit der GPU kompatibel ist). Dies ist zumindest bei den Modellen WIN2K und WDDM der Fall.

Also ... wenn Ihr Prozess abstürzt oder auf andere Weise abbricht, ist es in diesen Modellen die Aufgabe des Betriebssystems, den Kernel-Modus-Treiber aufzurufen, um alle mit dem Prozess verbundenen Ressourcen freizugeben.

Nun, ob Sie sollten oder nicht, ist wirklich etwas, das ein bisschen wie Tabs oder Leerzeichen in Quellcode fragt. Unterschiedliche Menschen haben hier unterschiedliche Überzeugungen. "Das OS wird es trotzdem tun, das sofortige Beenden ist eine bessere Endbenutzererfahrung" vs "Ich möchte wissen, ob ich Speicher verliere, weil ich, wenn mein Programm lange läuft, wirklich nicht will, dass es OOM-Fehler trifft "Die beste Art, dies zu tun, ist, überall undicht zu sein", sind die zwei wichtigsten Gedankengänge, die mir bekannt sind.

    
Bahbar 07.02.2010 09:50
quelle
1

Wenn Ihr Programm beendet wird (oder abstürzt), sollte jeder Speicher, den er gerade zugewiesen hat, auf die gleiche Weise freigegeben werden, wie der Hauptspeicher normalerweise freigegeben wird, wenn ein Programm beendet wird. Es kann einige Zeit dauern, bis die GPU erkennt, dass der Speicher wieder verfügbar ist.

Sie sollten sich jedoch nicht auf dieses Verhalten verlassen, da es davon abhängen kann, wie die Grafikkartentreiber implementiert wurden. Es ist viel besser, explizite Aufreinigungsaufrufe zu machen, wenn Sie (als Programmierer) wissen, dass Sie diesen Speicher nicht mehr benötigen werden.

    
ChrisF 06.02.2010 23:09
quelle
1

Alle Ihre GPU-Ressourcen werden freigegeben, wenn Ihr Programm beendet wird. Eine einfache Möglichkeit zum Testen besteht darin, Dinge nicht zu löschen und Ihre App wiederholt auszuführen, um zu sehen, ob sie nach einigen Iterationen fehlschlägt.

    
Alan 07.02.2010 05:02
quelle
-1

In OpenGL gibt es keinen Speicher zum Speichern der Zeicheninformationen. Hier, wenn wir das opengl-Programm ausführen, rufen wir zu diesem Zeitpunkt die Aufrufrahmenmethode auf, die sequentiell aufruft. Wie auch immer, wenn wir eine Linie oder einen Kreis zeichnen, bedeutet dies, dass jedes Mal, wenn es aufgerufen wird, eine Rahmenmethode zum Zeichnen an einer bestimmten Stelle gezeichnet wird. Opengl speichert diese Linie jedoch nicht im Speicher. Jederzeit, nur seine Zeichnung. aber als wir sahen, wurde diese Linie erfolgreich gedämmert.

Beispiel: In Android Openggl es2.0 verwendet diese Renderer-Klasse innerhalb der drawframe Methode (inside draw method), um die Linien oder Kreise usw. zu zeichnen.      Ich habe dieses OpenGL es2.0 Programm in Android AutoCAD App Entwicklung verwendet. Wenn Sie die markierten Zeilen löschen möchten, verwenden Sie diese Methode in der Renderer-Klasse in der onDrawframe-Methode         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);

    
harikrishnan 21.06.2013 07:05
quelle