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.