Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Memory Leck durch Bitmaps? (https://www.delphipraxis.net/10113-memory-leck-durch-bitmaps.html)

thehed 11. Okt 2003 21:15


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;

SirThornberry 11. Okt 2003 22:50

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

Christian Seehase 11. Okt 2003 23:47

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:
ObjektVariable := Klasse.Create;
try
finally
  FreeAndNil(ObjektVariable);
  // oder zumindest
  ObjektVariable.free;
end;
wenn Du ein Objekt erzeugst, kann Dir so etwas nicht so leicht passieren ;-)
Gilt natürlich auch für andere Resourcenbelegungen.

thehed 11. Okt 2003 23:51

Re: Memory Leck durch Bitmaps?
 
Danke fürs durchsehen :)
Leider besteht das problem trotzdem :( .

Christian Seehase 12. Okt 2003 00:14

Re: Memory Leck durch Bitmaps?
 
Moin thehead,

hast Du auch schon mal die ganze ilxxx Funktionen einer Prüfung unterzogen?

Keldorn 12. Okt 2003 10:06

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 : http://www.automatedqa.com/downloads/memproof.asp

Mfg Frank

thehed 12. Okt 2003 11:38

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?

Keldorn 12. Okt 2003 13:58

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.

thehed 12. Okt 2003 19:42

Re: Memory Leck durch Bitmaps?
 
Zitat:

Zitat von Keldorn
lade dir noch die alten Memproof-Versionen runter, bzw die, wo die Hilfe .

Ja hab ich gemacht und alles so eingestellt wie in der Anleitung beschrieben.
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 19:47 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