AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi glDeleteTextures gibt Speicher nicht frei
Thema durchsuchen
Ansicht
Themen-Optionen

glDeleteTextures gibt Speicher nicht frei

Ein Thema von EWeiss · begonnen am 23. Mai 2008 · letzter Beitrag vom 21. Jul 2008
Antwort Antwort
Seite 2 von 3     12 3      
EWeiss
(Gast)

n/a Beiträge
 
#11

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 16. Jul 2008, 23:10
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
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#12

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 16. Jul 2008, 23:19
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.
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 16. Jul 2008, 23:32
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 16. Jul 2008, 23:57
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
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#15

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:16
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( ...)
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}
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#16

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:20
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
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#17

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:28
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
{.$define NO_NATIVE_GL} Dort löscht du einfach den Punkt vor $define, speicherst und fertig!

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
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#18

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:33
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
{.$define NO_NATIVE_GL} Dort löscht du einfach den Punkt vor $define, speicherst und fertig!

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
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#19

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:37
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

Grüße und gute Nacht
Dave
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#20

Re: glDeleteTextures gibt Speicher nicht frei

  Alt 17. Jul 2008, 00:41
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

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:54 Uhr.
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