Frage

Muss ich alle Displaylisten, Texturen, (Geometrie-) Shader usw. über die GLDELETETE* -Funktionen aufräumen, oder wird das GPU-MEM, wenn mein Programm beendet/abstürzt, automatisch befreit?

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

War es hilfreich?

Lösung

Frei den Kontext, alles andere ist lokal im Kontext (es sei denn, Sie haben die Freigabe von Anzeigenlisten aktiviert) und werden zusammen mit ihm verschwinden.

Andere Tipps

Wie andere erwähnt, sollte Ihr Betriebssystem (in Zusammenarbeit mit dem Treiberressourcenmanager) die Ressourcen veröffentlichen. Dafür sind Osen da. Es ist erwähnenswert, dass dies nichts mit OpenGL zu tun hat, aber etwas ist Teil der Charta von gut verhaltenen Osen und ihren damit verbundenen Fahrern. Das Betriebssystem ist da, um zu handhaben alle Die Systemressourcen. OpenGL -sind nur eine Teilmenge von ihnen, und sie unterscheiden sich nicht von einem Dateihandle. Um nun konkreter zu werden, sollten Sie angeben, welches Betriebssystem Sie interessieren.

Übrigens, hier nehme ich mit Chrisfs Antwort eine Ausnahme. Es sollte nicht vom Fahrer liegen, zu entscheiden, dass er aufräumen muss. OS-Treibermodelle verfügen über eine klare Schnittstelle zwischen dem OpenGL-Treiber des Benutzermodus (die keine tatsächliche GFX-Ressourcenzuweisung ausführen sollte, da es im Computer gemeinsam genutzt wird), das Betriebssystem (das das Äquivalent von Systemaufrufen zur Zuweisung von Ressourcen und der Kernel-Mode-Treiber (dh lediglich dort, um die Betriebssystembestellungen auf eine Weise auszuführen, die mit der GPU kompatibel ist). Dies ist zumindest bei den Modellen Win2K und WDDM der Fall.

Wenn Ihr Prozess in diesen Modellen abstürzt oder auf andere Weise endet, liegt es in der OS-Verantwortung, den Kernel-Mode-Treiber aufzurufen, um alle mit dem Prozess verbundenen Ressourcen zu befreien.

Nun, ob Sie sollte Oder nicht wirklich etwas, das ein bisschen wie das Fragen von Registerkarten oder Spaces im Quellcode ist. Unterschiedliche Menschen haben hier unterschiedliche Überzeugungen. "Das Betriebssystem wird es sowieso tun, so sofort zu beenden ist eine bessere Endbenutzererfahrung" vs "Ich möchte wissen, ob ich den Gedächtnis veröffentlichen kann, denn wenn mein Programm langlebig ist, möchte ich wirklich nicht Der beste Weg, dies zu tun, ist, durchgehend frei zu sein. "Sie sind die 2 Hauptlinien von Gedanken, die mir bekannt sind.

Wenn Ihr Programm beendet (oder abstürzt), sollte jeder Speicher, den es derzeit zugewiesen hat, irgendwann auf die gleiche Weise befreit werden, wie das Hauptspeicher normalerweise befreit wird, wenn ein Programm beendet ist. Es kann einige Zeit dauern, bis die GPU "merkt", dass der Speicher wieder zur Verwendung verfügbar ist.

Sie sollten sich jedoch nicht auf dieses Verhalten verlassen, da es möglicherweise davon abhängt, wie die Grafikkartentreiber implementiert wurden. Es ist weitaus besser, explizite Aufräumanrufe zu tätigen, wenn Sie (als Programmierer) wissen, dass Sie diesen Speicher nicht wieder benötigen.

Alle Ihre GPU -Ressourcen werden veröffentlicht, wenn Ihr Programm beendet ist. Eine einfache Möglichkeit zu testen besteht darin, Dinge nicht zu löschen und Ihre App wiederholt auszuführen, um festzustellen, ob sie die Zuteilungen nach ein paar Iterationen fehlschlägt.

In OpenGL gibt es keinen Speicher, um die Zeichnungsinformationen zu speichern. Wenn wir hier das OpenGL -Programm ausführen, rufen Sie diese Zeit auf, die nacheinander aufgerufen wird. Wenn wir eine Linie oder einen Kreis zeichnen, können Sie jederzeit die Zeichnung des Zeichnens für das Zeichnen am bestimmten Ort zeichnen. Aber OpenGL speichert diese Linie nicht im Speicher. Immer nur seine Zeichnung. Aber als wir sahen, wird diese Linie erfolgreich eingebunden.

EX: In Android OpenGL ES2.0 verwendete diese Renderer -Klasse innerhalb der Drawframe -Methode (Innere Zeichnungsmethode), um die Linien oder Kreise usw. zu zeichnen Dawned Lines verwenden 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);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top