OpenGL Memory Leak
-
Mahlzeit!
Über den Sinnlows Task-Manager habe ich festgestellt, das mein Programm ein Paar KB Speicher nicht wieder freigibt. Da ich MS VC 6.0 benutze, müsste normalerweise ein Hinweis über das Memory-Leak nach dem Ausführen kommen. Diese Meldung kommt aber nicht. Darum geh ich mal davon aus, das der Speicher von der einzigsten Fremd-Lib die ich verwende stammen muss - Und das ist OpenGL.
Alles was ich mache, ist ein Paar Quads zeichnen und mit Texturen belegen.
Wenn ich fertig bin, lösche ich die Texturen wieder über die Funktion glDeleteTextures.
Code:glDeleteTextures(nTexturenZahl, TexturenArray); // Syntax korrekt ?
Muss ich sonst noch was beachten, wenn ich mit OpenGL arbeite ?
Neben den Texturen verwende ich noch Alpha-Blending - Dürfte aber meines Wissens keine Probleme machen.
Am restlichen Programm kann es eigentlich nicht liegen, weil ich nirgends dynamisch Speicher reserviere oder ähnliches mache
-
Original erstellt von Cpp_Junky:
Über den Sinnlows Task-Manager [...]Oh Mann. Wenn Dich das Mircosoft-Betriebssystem doch soooo nervt, bzw. es Dir sinnlos erscheint...
...DANN BENUTZ' ES DOCH EINFACH NICHT!!!
Kannst Dir ja - jedesmal wenn wat net läuft - 'nen neuen Kernel compilieren...!
ROTFL :p
MfG, Sarge
-
Da ich MS VC 6.0 benutze, müsste normalerweise ein Hinweis über das Memory-Leak nach dem Ausführen kommen.
also bei mir kommt da nie was . . .
-
msvc++ überprüft standardmäßig nicht, ob alle dynamischen speicherbereiche wieder freigegeben wurden! wie kommst du darauf? und wie genau hast du mit dem taskmanager festgestellt, das du speicherlöscher hast?
-
Probier doch mal nen Memorylogger.
Aber an den GL Texturen liegts bestimmt nicht.
Ich empfehle dir einfach mal den von Fruityloops
-
1. Kannst du mir nicht erzählen, das du NUR OpenGL als Extra-Lib nimmst
2. Zieh dir die neusten Treiber, kann ein Treiberbug sein (unwahrscheinlich)
3. Hast du den RenderingContext, den DeviceContext und das Window richtig
abgebaut?
4. An den Texturen kann es eingentlich nicht liegen, die werden im V-Ram
abgelegt.
-
Ausserdem ist der Taskmanager nicht "genau".
-
Außerdem sind die Angaben von Windows
-
Original erstellt von <Sgt. Nukem>:
Oh Mann. Wenn Dich das Mircosoft-Betriebssystem doch soooo nervt, bzw. es Dir sinnlos erscheint...Muss sowas denn immer sein?
Ich benutze Linux auch wenns Sachen gibt die mich daran nerven und darüber darf ich genauso jammern wie ein Windows-User über die Macken seines OS darf, da ist doch nichts dabei! :o
-
Original erstellt von nman:
...da ist doch nichts dabei! :oMhhhh... normalerweise dürfen nur Linux-User über Windows lästern, net umgekehrt.
Zumindest werde ich im umgekehrten Falle immer schief angeguckt.
Aber is' ja schön, wenn tatsächlich etwas Toleranz vorhanden sein sollte mittlerweile.
Nur geht mir dieses pseudo-intellektuelle Getue auf die Nerven, das besonders die UNIXXER beherrschen.
Und falls ich seinen Post fälschlicherweise als "Ich würd' zwar viiiiiel lieber Linux benutzen, aber ich MUSS JA Windoof benutzen...! *heul*" interpretiert haben sollte: Sorry.CU all in PC-Land...
-
@nman:
Nö, da s nix dabei, ausser das man seine Frage glech wieder in so eine Linux vs. Win Schlammschlacht ausarten lässt und die bringen schonmal grundsätlich nix. Aber wenn man sowieso keine ordentliche Antwort wollte, dann ist das ja egal...
-
Also, vielleicht hab ich das Problem nich gut beschrieben:
Es geht um ein kleines Spiel. Und das Memory-Leak macht sich nicht beim Beenden bemerkbar, sondern wenn ich von einer Spiel-Szene in die nächste wechsel.
Jede Szene wird durch ein Objekt einer eigenen Klasse abgebildet - Das Programm hat immer so ein "CScene" Objekt im Speicher. Dieses CScene Objekt beinhaltet z.B auch die Textur-Daten.
Beim Wechsel in die nächste Szene, wird das alte Objekt komplett aus dem Speicher gelöscht (sollte es jedenfalls). Wenn ich jetzt den WINdows (nur für dich Sgt. Nukem
) Task-Manager offen habe und den Speicherverbrauch sehe, dann fällt auf, das irgendwo was nicht wieder freigegeben wird. Ich springe also immer zwischen 2 Szenen hin und her und beobachte den Speicherbedarf. Jedes mal sind es mal 10 ein anderes mal 100 KB mehr als beim letzten Aufruf der Szene. Das gibt mir doch schon zu denken, da das nach ein Paar-Szenenwechseln locker ein Paar MB sein könnten.
Dann habe ich mir mal die Arbeit gemacht, das ganze OpenGL Zeugs rauszuschmeissen - Und siehe da: Der Fehler ist weg
Sehr mysteriös...
Werd mir gleich mal diesen Memory Logger reinziehen und gucken was bei rauskommt[Nachtrag des Captains, Sternzeit xyz]:
Wo bekomm ich diesen MemoryLogger ?[ Dieser Beitrag wurde am 23.05.2003 um 10:15 Uhr von Cpp_Junky editiert. ]
-
steigt das denn immer mehr an? oder hört das irgendwann auf?
-
Original erstellt von Cpp_Junky:
Wenn ich jetzt den WINdows (nur für dich Sgt. Nukem) Task-Manager offen habe und den Speicherverbrauch sehe
Heeey, wie nett von Dir! *vorfreudedurchszimmerspring*
Jedes mal sind es mal 10 ein anderes mal 100 KB mehr als beim letzten Aufruf der Szene. Das gibt mir doch schon zu denken, da das nach ein Paar-Szenenwechseln locker ein Paar MB sein könnten.
Und das liegt nicht am steigenden Komplexitätsgrad Deiner "Szenen"?! Daß z.B. im 2. mehr Texturen o.ä. geladen werden als im 1.?!
Werd mir gleich mal diesen Memory Logger reinziehen und gucken was bei rauskommt
Einen Memory-Logger könntest Du Dir ja auch selber schreiben (irgendwie), indem Du jeder Klasse eine Methode getMemoryUsage() oder so spendierst, und diese dann alle Members durchrödelt und die summierte Größe zurückgibt. Is' aber natürlich'n Heidenaufwand.
[Nachtrag des Captains, Sternzeit xyz]:
Wo bekomm ich diesen MemoryLogger ?DAS würde mich auch mal interessieren. Ich finde nur Synthesizer und MIDI-Geräte unter diesem Namen...
-
So hab den Fehler gefunden! *freu*
Durch einen Zufall habe ich gesehen, das ich an einer Stelle eine Display-List zur Textdarstellung verwende - Die wurde aber nicht ordentlich gelöscht
-
Tjaaaa... an was für Pimpelsdingen es manchmal (meistens?) liegt...