![]() |
Memory Leck durch Bitmaps?
Hallo
Ich hab da ein Programm geschrieben dass einige Bilder zu einem grossen merged leider hab ich jetzt festgestellt das bei jedem Durchlauf 256Mb ram verschwinden Das ist in etwa die grösse die das fertige Bild hat. Findet hier jemand das Leck? Ich such schon Stunden :roll:
Delphi-Quellcode:
zwischenBitmap := TBitmap.Create;
zwischenBitmap.Width := 200 ; zwischenBitmap.Height := 200; hauptBitmap := tbitmap.create; hauptBitmap.Width := texturmenge*200 ; hauptBitmap.Height := texturmenge*200; Bitmap := TBitmap.Create; // overwrite file if it exists ilEnable( il_File_Overwrite ); // -----------------Bilder laden ------------------------------------ //progresbar steuerung------- progressbar1.max:=texturmenge*texturmenge; progressbar1.Position:=0; for xi:=0 to (texturmenge-1) do begin for yi:=0 to (texturmenge-1) do begin MemDC := CreateCompatibleDC(Canvas.Handle); ilGenImages(1, @imgID); ilBindImage(imgid); // Bild Laden xwert:=inttostr(xi); ywert:=inttostr(yi); namen:=('texture\tx0'+(xwert)+'x0'+(ywert)+'.dds'); ilLoadImage (pchar(namen)); progressbar1.position:=progressbar1.Position+1; Bitmap := TBitmap.Create; Bitmap.Width := ilGetInteger(IL_IMAGE_WIDTH); Bitmap.Height :=ilGetInteger(IL_IMAGE_HEIGHT); _Bitmap := ilutConvertToHBitmap(Bitmap.Canvas.Handle); SelectObject(MemDC, _Bitmap); //das ist klar BitBlt(Bitmap.Canvas.Handle,(0),(0), Bitmap.Width, Bitmap.Height, MemDC, 0,0, SRCCOPY); zwischenbitmap.canvas.stretchdraw(rect(0,0,200,200),bitmap); BitBlt(hauptbitmap.Canvas.Handle,(xi*200),(yi*200), Bitmap.Width, Bitmap.Height, zwischenBitmap.Canvas.Handle,0,0, SRCCOPY); ilDeleteImages(1, @ImgId); DeleteDC(MemDC); DeleteObject(_Bitmap); bitmap.Free; end; end; iluDeleteImage(imgID); ilDeleteImages(1, @ImgId); DeleteObject(_Bitmap); DeleteDC(MemDC); Image1.Picture.Assign(hauptbitmap); bitmap:=tbitmap.create; try bitmap.Width:= image1.Width; bitmap.Height:= image1.Height; bitmap.Canvas.CopyMode:= cmSrcCopy; bitmap.Canvas.CopyRect( Rect(0, 0, bitmap.Width, bitmap.Height), image1.Canvas, Rect(0, bitmap.Height - 1, bitmap.Width, -1)); image1.picture.assign(bitmap); finally Bitmap.Free; end; hauptbitmap.free; zwischenbitmap.Free; |
Re: Memory Leck durch Bitmaps?
hauptBitmap.Height := texturmenge*200;
Bitmap := TBitmap.Create; ... progressbar1.position:=progressbar1.Position+1; Bitmap := TBitmap.Create; Du initialisierst Bitmap durch TBitmap.Create. Danach das gleiche nochmal (paar zeilen weiter unten) ohne das vorhergehend initialisierte wieder freizugeben |
Re: Memory Leck durch Bitmaps?
Moin thehed,
dazu ein kleiner Tip. Wenn Du Dir angewöhnst immer erst so eine Struktur zu schreiben
Delphi-Quellcode:
wenn Du ein Objekt erzeugst, kann Dir so etwas nicht so leicht passieren ;-)
ObjektVariable := Klasse.Create;
try finally FreeAndNil(ObjektVariable); // oder zumindest ObjektVariable.free; end; Gilt natürlich auch für andere Resourcenbelegungen. |
Re: Memory Leck durch Bitmaps?
Danke fürs durchsehen :)
Leider besteht das problem trotzdem :( . |
Re: Memory Leck durch Bitmaps?
Moin thehead,
hast Du auch schon mal die ganze ilxxx Funktionen einer Prüfung unterzogen? |
Re: Memory Leck durch Bitmaps?
Hallo,
ich weiß jetzt nicht, wie dein jetziger code aussieht, vielleicht hast du noch ein tBitmap .create ohne free übersehen. dieses Prog hilft dir dabei : ![]() Mfg Frank |
Re: Memory Leck durch Bitmaps?
Danke für den Link
Zuerst muss man wohl dieses program verstehgen;) bitmaps bleiben immer 2 übrig peek ist 4 das scheint demnach ok zu sein. Durch probieren schein ich jetzt den fehler eingegrenzt zu haben hier: _Bitmap := ilutConvertToHBitmap(Bitmap.Canvas.Handle); wenn man diesen Befehl nicht ausführt,dann wird der speicher zuletzt wieder freigegeben. Möglicherweise fehler in Devil? oder muss man danach etwas beachten? |
Re: Memory Leck durch Bitmaps?
lade dir noch die alten Memproof-Versionen runter, bzw die, wo die Hilfe mit dabei ist. Da ist ausführlich erklärt, was du in den Delphi-optionen einstellen mußt (z.b. mit T32-debug-info ... ). Anschließend zeigt dir memproof deinen Source auch mit an und zeigt dir genau, zu welchen create kein free da ist, das betrifft auch weitere Befehle, die Speicher reservieren und hilft dir immens weiter.
|
Re: Memory Leck durch Bitmaps?
Zitat:
Alles was ich weis ist gleichviel wie in meinem letzten posting.Es ist definitiv dieser Befehl irgendwie bleibt da immer ein 1024x1024 rest übrig,bei 64 teilen gibt das meine 256 -270 mb Ram. Egal ich machs jetzt anders: Da zuerst sowiso die ganzen Texturen und anderen Files entpackt werden müssen (Rfa) um damit eine art Arbeitsumgebung zu erschaffen,konvertiere ich auch noch gleich die dds Files zu bmp das machts sogar einfacher.Braucht jedenfalls fast keinen Speicher mehr. Ich danke für alle Hilfen :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz