Re: glDeleteTextures gibt Speicher nicht frei
Muss das nochmal aufgreifen
Delphi-Quellcode:
Das hatten wir schon.
if Assigned(QuadTexture) then
begin glDeleteTextures(Length(QuadTexture), @QuadTexture[Low(QuadTexture)]); SetLength(QuadTexture, 0); end; 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 |
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:
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.
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; |
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:
EDIT2:
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; Das ist der part des Textureloaders für JPG ohne von resource laden... Da wird alles freigegeben.
Delphi-Quellcode:
Gruss Emil
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; |
Re: glDeleteTextures gibt Speicher nicht frei
Zitat:
|
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:
Was aber sicherlich niemals schaden wird ist am Schluss noch ( nach Texture := CreateTexture( ...)
// ... 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;
Delphi-Quellcode:
aufzurufen
SetLength(Data, 0);
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} |
Re: glDeleteTextures gibt Speicher nicht frei
Zitat:
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 |
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:
Dort löscht du einfach den Punkt vor $define, speicherst und fertig!
{.$define NO_NATIVE_GL}
Zitat:
|
Re: glDeleteTextures gibt Speicher nicht frei
Zitat:
Fehler lag nicht an glDeleteTextures :) Schau mal hier .. deine..
Delphi-Quellcode:
meine..
End;
BMP.free; JPG.free; Texture :=CreateTexture(Width, Height, GL_RGBA, addr(Data[0])); result :=TRUE; end;
Delphi-Quellcode:
definitiv fehlt da was ;)
end;
finally BMP.Free; end; result :=TRUE; 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 |
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 |
Re: glDeleteTextures gibt Speicher nicht frei
Zitat:
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. |
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