Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi glDeleteTextures gibt Speicher nicht frei (https://www.delphipraxis.net/114309-gldeletetextures-gibt-speicher-nicht-frei.html)

EWeiss 16. Jul 2008 23:10

Re: glDeleteTextures gibt Speicher nicht frei
 
Muss das nochmal aufgreifen

Delphi-Quellcode:
    if Assigned(QuadTexture) then
    begin
      glDeleteTextures(Length(QuadTexture), @QuadTexture[Low(QuadTexture)]);
      SetLength(QuadTexture, 0);
    end;
Das hatten wir schon.
Warum wird der Speicher nicht freigegeben wenn die Texturen geöscht werden ?

Solange wie ich Cover aktiviere die innerhalb des Albumkreis schon vorhanden sind gibt es keine probleme
Lade ich neue addiert der speicher jedesmal um 10 MB ??
Das kann es irgendwo nicht sein.

gruss Emil

littleDave 16. Jul 2008 23:19

Re: glDeleteTextures gibt Speicher nicht frei
 
Ich glaube ja [immer noch], dass es nicht an glDeleteTextures liegt, sondern dass du beim Laden irgendwas nicht wieder freigibst. Mach mal folgendes: du hast doch sicherlich eine Funktion in der Art LoadCoverFromFile(...) (oder so). Jetzt schreibst du folgende Methode hinein:

Delphi-Quellcode:
procedure CreateTempTexture(var Target: cardinal);
var pTexData: Pointer;
begin
  GetMem(pTexData, 512*512*3);
 
  // Textur generieren und drauf zeigen
  glGenTextures(1, @Target);
  glBindTexture(GL_TEXTURE_2D, Target);
 
  // Daten in den Speicher, Lineares Filtering aktivieren
  glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 
  // Freigeben
  FreeMem(pTexData);
end;
Jetzt rufst du anstatt deiner LoadCoverFromFile diese Funktion auf (vielleicht noch etwas anpassen!). Wenn dann der Speicher immernoch nicht wieder freigeräumt wird mit der glDeleteTextures - Methode, kann ich von hier auch nicht mehr groß helfen - ich hab dann überhaupt keine Ahnung woran es dann liegt.

EWeiss 16. Jul 2008 23:32

Re: glDeleteTextures gibt Speicher nicht frei
 
Danke das werd ich mal versuchen..
Ich gehe so vor

in acover befinden sich die Pfade zu den texturen
welche dann quadTexture : GLUint; zugewiesen werden abhängig vom CoverCount
also wieviele Cover zur laufzeit geladen werden sollen von 5 > Max 25.

Damit die Cover nicht immer wieder neu geladen werden wenn sie vorhanden sind
habe ich eine TStringList erstellt LstQuadTexture

Diese beinhaltet dann die quadTexture als Text
Damit vergleiche ich dann wenn ein neuer Titel abgespielt wird.
Ist die Texture vorhanden wird sich lediglich aktiviert nicht neu geladen.
LoadCover wird dann übersprungen.

Bei jeden aufruf von LoadCover werden (sollten) alle Cover gelöscht werden.
Aber anstelle zu löschen werden wie schon gesagt immer wieder so etwa 10 MB addiert.

Die LadeRoutine für die JPG, BMP ist die von Sulaco.
Da wird aber alles direkt wieder freigegeben.

EDIT:
Habe das jetzt mal versucht..
Anstelle von
LoadTexture(aCovers[i], quadTexture[i], False);
deine function zum testen genommen .. hoffe das ist richtig so ;)
So wie du sagst erstellt diese eine Temporäre Texture also alle Quader werden jetzt einfach
mit dieser gefüllt (alles schwartz)

Speicher wird einwandfrei freigegeben.
Delphi-Quellcode:
              if (aFileName = 'COVER') then
              begin
                CreateTempTexture(quadTexture[i]);
                //LoadTexture(aCovers[i], quadTexture[i], False);
                LstQuadTexture.Add(IntToStr(quadTexture[i]));
                LstCoverPath.Add(aCovers[i]);
                LastAddCover := Trunc(quadTexture[i]);
              end;
EDIT2:
Das ist der part des Textureloaders für JPG ohne von resource laden...
Da wird alles freigegeben.

Delphi-Quellcode:
  end
  else
  begin
    try
      JPG.LoadFromFile(Filename);
    except
      MessageBox(0, PChar('Couldn''t load JPG - "'+ Filename +'"'), PChar('BMP Unit'), MB_OK);
      Exit;
    end;
  end;

  // Create Bitmap
  BMP:=TBitmap.Create;
  try
  BMP.pixelformat:=pf32bit;
  BMP.width:=JPG.width;
  BMP.height:=JPG.height;
  BMP.canvas.draw(0,0,JPG);       // Copy the JPEG onto the Bitmap

  MStream := TMemoryStream.Create;
    try
      BMP.TransparentMode := tmAuto;
      BMP.PixelFormat := pf24bit; // just because this format works!
      BMP.Dormant;                 // make it so!
      BMP.SaveToStream(MStream);
      MStream.Seek(0,soFromBeginning);
      LoadBMPTextureFromStream(MStream, Texture);
    finally
      MStream.free;
    end;
  finally
    BMP.Free;
  end;
  result :=TRUE;
Gruss Emil

EWeiss 16. Jul 2008 23:57

Re: glDeleteTextures gibt Speicher nicht frei
 
Zitat:

Zitat von EWeiss
Danke das werd ich mal versuchen..
Ich gehe so vor

in acover befinden sich die Pfade zu den texturen
welche dann quadTexture : GLUint; zugewiesen werden abhängig vom CoverCount
also wieviele Cover zur laufzeit geladen werden sollen von 5 > Max 25.

Damit die Cover nicht immer wieder neu geladen werden wenn sie vorhanden sind
habe ich eine TStringList erstellt LstQuadTexture

Diese beinhaltet dann die quadTexture als Text
Damit vergleiche ich dann wenn ein neuer Titel abgespielt wird.
Ist die Texture vorhanden wird sich lediglich aktiviert nicht neu geladen.
LoadCover wird dann übersprungen.

Bei jeden aufruf von LoadCover werden (sollten) alle Cover gelöscht werden.
Aber anstelle zu löschen werden wie schon gesagt immer wieder so etwa 10 MB addiert.

Die LadeRoutine für die JPG, BMP ist die von Sulaco.
Da wird aber alles direkt wieder freigegeben.

EDIT:
Habe das jetzt mal versucht..
Anstelle von
LoadTexture(aCovers[i], quadTexture[i], False);
deine function zum testen genommen .. hoffe das ist richtig so ;)
So wie du sagst erstellt diese eine Temporäre Texture also alle Quader werden jetzt einfach
mit dieser gefüllt (alles schwartz)

Speicher wird einwandfrei freigegeben.
Delphi-Quellcode:
              if (aFileName = 'COVER') then
              begin
                CreateTempTexture(quadTexture[i]);
                //LoadTexture(aCovers[i], quadTexture[i], False);
                LstQuadTexture.Add(IntToStr(quadTexture[i]));
                LstCoverPath.Add(aCovers[i]);
                LastAddCover := Trunc(quadTexture[i]);
              end;
EDIT2:
Das ist der part des Textureloaders für JPG ohne von resource laden...
Da wird alles freigegeben.

Delphi-Quellcode:
  end
  else
  begin
    try
      JPG.LoadFromFile(Filename);
    except
      MessageBox(0, PChar('Couldn''t load JPG - "'+ Filename +'"'), PChar('BMP Unit'), MB_OK);
      Exit;
    end;
  end;

  // Create Bitmap
  BMP:=TBitmap.Create;
  try
  BMP.pixelformat:=pf32bit;
  BMP.width:=JPG.width;
  BMP.height:=JPG.height;
  BMP.canvas.draw(0,0,JPG);       // Copy the JPEG onto the Bitmap

  MStream := TMemoryStream.Create;
    try
      BMP.TransparentMode := tmAuto;
      BMP.PixelFormat := pf24bit; // just because this format works!
      BMP.Dormant;                 // make it so!
      BMP.SaveToStream(MStream);
      MStream.Seek(0,soFromBeginning);
      LoadBMPTextureFromStream(MStream, Texture);
    finally
      MStream.free;
    end;
  finally
    BMP.Free;
  end;
  result :=TRUE;
Gruss Emil


littleDave 17. Jul 2008 00:16

Re: glDeleteTextures gibt Speicher nicht frei
 
Hab gerade mal auf meiner Platte gewühlt und die alte Textures.pas gefunden. Der Abschnitt schaut bei mir etwas anders aus:

Delphi-Quellcode:
// ... rest abgeschnitten
  begin
    try
      JPG.LoadFromFile(Filename);
    except
      MessageBox(0, PChar('Couldn''t load JPG - "'+ Filename +'"'), PChar('BMP Unit'), MB_OK);
      Exit;
    end;
  end;

  // Create Bitmap
  BMP:=TBitmap.Create;
  BMP.pixelformat:=pf32bit;
  BMP.width:=JPG.width;
  BMP.height:=JPG.height;
  BMP.canvas.draw(0,0,JPG);       // Copy the JPEG onto the Bitmap

  //  BMP.SaveToFile('D:\test.bmp');
  Width :=BMP.Width;
  Height :=BMP.Height;
  SetLength(Data, Width*Height);

  For H:=0 to Height-1 do
  Begin
    Line :=BMP.scanline[Height-H-1];  // flip JPEG
    For W:=0 to Width-1 do
    Begin
      c:=Line^ and $FFFFFF; // Need to do a color swap
      Data[W+(H*Width)] :=(((c and $FF) shl 16)+(c shr 16)+(c and $FF00)) or $FF000000; // 4 channel.
      inc(Line);
    End;
  End;

  BMP.free;
  JPG.free;

  Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0]));
  result :=TRUE;
end;
Was aber sicherlich niemals schaden wird ist am Schluss noch ( nach Texture := CreateTexture( ...)
Delphi-Quellcode:
SetLength(Data, 0);
aufzurufen

Der Loader von Sulaco ist zwar schön und gut, doch so ganz neu ist der ja nun auch nicht mehr ;-). Ich würd dir in der Hinsicht dringend empfehlen, einen anderen Texture-Loaded (z.B. glBitmap) zu verwenden. Bei glBitmap hast du sogar noch den Vorteil, dass fast nichts umschreiben musst - dort gibt es auch eine Funktion namens LoadTexture, die genauso aufgebaut ist wie die von Jan Horn. Ich persönlich arbeite noch mit Version 1.8.9 dieses Headers, daher weiß ich nicht, was sich seit dem genau verändert hat.
Falls du den Header verwendest, solltest du ihn natürlich vorher einstellen (die Defines am Anfang}

EWeiss 17. Jul 2008 00:20

Re: glDeleteTextures gibt Speicher nicht frei
 
Zitat:

Falls du den Header verwendest, solltest du ihn natürlich vorher einstellen (die Defines am Anfang}
ja und da habe ich ein problem mit ;)
Habe nach dem Loader schon geschaut .. schäm. muss gestehen keine ahnung was ich da einstellen soll

EDIT:
Und zusätzlich dazu muss dann noch einige fremd DLL's mit einbauen freejpg und was weiss ich noch alles.
Die DLL soll eigentlich einzeln ausgegeben werden.

gruss Emil

littleDave 17. Jul 2008 00:28

Re: glDeleteTextures gibt Speicher nicht frei
 
Das ist nicht schwer - wirklich. Falls du den DelphiGL-Header (dglOpenGl.pas) benutzt, ist es sehr einfach. Du lädst dir hier die Version glBitmap_1.8.9.zip herunter. Dann extrahierst du die Datei in einen beliebigen Order und fügst den in den Such-Pfad von Delphi hinzu.
Jetzt öffnest du die Datei - Windows NotePad reicht dabei vollkommen. Ganz oben im Interface-Abschnitt findest du dann die Zeile
Delphi-Quellcode:
{.$define NO_NATIVE_GL}
Dort löscht du einfach den Punkt vor $define, speicherst und fertig!

Zitat:

Zitat von EWeiss
Und zusätzlich dazu muss dann noch einige fremd DLL's mit einbauen freejpg und was weiss ich noch alles.
Die DLL soll eigentlich einzeln ausgegeben werden.

Bei Version 1.8.9 brauchst du keine weiteren DLLs. Ab Version 2.0 (glaub ich) hat Lossy auf libJpeg umgestellt, aber die Versionen davor brauchen keine weiteren DLLs

EWeiss 17. Jul 2008 00:33

Re: glDeleteTextures gibt Speicher nicht frei
 
Zitat:

Zitat von littleDave
Das ist nicht schwer - wirklich. Falls du den DelphiGL-Header (dglOpenGl.pas) benutzt, ist es sehr einfach. Du lädst dir hier die Version glBitmap_1.8.9.zip herunter. Dann extrahierst du die Datei in einen beliebigen Order und fügst den in den Such-Pfad von Delphi hinzu.
Jetzt öffnest du die Datei - Windows NotePad reicht dabei vollkommen. Ganz oben im Interface-Abschnitt findest du dann die Zeile
Delphi-Quellcode:
{.$define NO_NATIVE_GL}
Dort löscht du einfach den Punkt vor $define, speicherst und fertig!

Zitat:

Zitat von EWeiss
Und zusätzlich dazu muss dann noch einige fremd DLL's mit einbauen freejpg und was weiss ich noch alles.
Die DLL soll eigentlich einzeln ausgegeben werden.

Bei Version 1.8.9 brauchst du keine weiteren DLLs. Ab Version 2.0 (glaub ich) hat Lossy auf libJpeg umgestellt, aber die Versionen davor brauchen keine weiteren DLLs

Ahhh dann ist alles ok werde dann umstellen :)
Fehler lag nicht an glDeleteTextures :)

Schau mal hier ..

deine..
Delphi-Quellcode:
  End;

  BMP.free;
  JPG.free;

  Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0]));
  result :=TRUE;
end;
meine..
Delphi-Quellcode:
    end;
  finally
    BMP.Free;
  end;
  result :=TRUE;
definitiv fehlt da was ;)
Kein wunder das nach 10 25x JPG Cover laden der speicher bei 80MB und drüber liegt.
Die größte leistung waren 1023 MB Speicher nur wegen der Vis ;)

Danke für den Tip werd es mal umändern.

gruss Emil

littleDave 17. Jul 2008 00:37

Re: glDeleteTextures gibt Speicher nicht frei
 
Hihi, stimmt - hätt ich jetzt nicht sofort gesehen - naja, bei der Uhrzeit auch verständlich ;-)

Falls es jetzt dann gehen sollte - bedenke: Never change a running system :zwinker:

Grüße und gute Nacht
Dave

EWeiss 17. Jul 2008 00:41

Re: glDeleteTextures gibt Speicher nicht frei
 
Zitat:

Zitat von littleDave
Hihi, stimmt - hätt ich jetzt nicht sofort gesehen - naja, bei der Uhrzeit auch verständlich ;-)

Falls es jetzt dann gehen sollte - bedenke: Never change a running system :zwinker:

Grüße und gute Nacht
Dave

ja stimmt schon.
Aber die glBitmap wird wohl einige optimierungen haben werd es mir mal anschauen.
Vielleicht bringt es mir geschwindigkeits vorteile

danke nochmal

gruss Emil


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz