Einzelnen Beitrag anzeigen

Schokohase
(Gast)

n/a Beiträge
 
#12

AW: FMX: TBitmap.Assign Methode erscheint mir nicht korrekt

  Alt 18. Apr 2018, 12:38
Ja, dachte ich mir ... darum habe ich extra ein string gewählt, denn dort wird beim Zuweisen nicht der Inhalt kopiert, sondern nur die Referenz (mit Erhöhung des Referenz-Zählers).

Es passiert dort also hinter den Kulissen exakt das Gleiche, was bei TBitmap mit dem Wert in FImage passiert (nur eben explizit).

Der tiefere Sinn dahinter: Ein und dasselbe Bild braucht nur einmal im Speicher liegen auch wenn man es an n Stellen anzeigen möchte.
Delphi-Quellcode:
var
  bitmaps: TObjectList<TBitmap>;
  b, bmp: TBitmap;
begin
  ...
  // Variante 1 - langsam, viel Spiecher verbraten
  for i := 1 to 100 do
  begin
    bitmaps.Add( TBitmap.CreateFromFile( 'test.png' ) );
  end;

  // Variante 2 - langsamer, viel Speicher verbraten
  bmp := TBitmap.CreateFromFile( 'test.png' );
  try
    for i := 1 to 100 do
    begin
      b := TBitmap.Create();
      b.SetSize( bmp.Size );
      b.CopyFromBitmap( bmp );
      bitmaps.Add( b );
    end;
  finally
    bmp.Free();
  end;

  // Variante 3 - sehr schnell, sehr wenig Speicher
  bmp := TBitmap.CreateFromFile( 'test.png' );
  try
    for i := 1 to 100 do
    begin
      b := TBitmap.Create();
      b.Assign( bmp );
      bitmaps.Add( b );
    end;
  finally
    bmp.Free();
  end;
  ...
end;
Keine dieser Varianten erzeugt allerdings ein Speicherleck und die Assign -Methode von TBitmap ist völlig korrekt, auch wenn diese noch so ungewöhnlich aussieht.
  Mit Zitat antworten Zitat