Autor Beitrag
Horschdware
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 744
Erhaltene Danke: 54

Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
BeitragVerfasst: Mi 16.03.11 17:34 
Hallo,
ich hätte hier ein kleines Problemchen mit einer Verständnisfrage. Ich schreibe gerade ein ganz ganz schnelles quick and dirty Progrämmchen und wundere mich...

Ich erzeuge zur Laufzeit mehrere TImage Komponenten, die flächendeckend auf einem Formular landen.
Ich weise jedem TImage ein kleines Bildchen zu in der Größe weniger KB - Arbeitsspeicherlast sehr gering.
Das Interessante hier: Lade ich die Bilder vorab in eine TImagelist und kopiere dann die Bitmap im Speicher zu den einzelnen TImages, dann wird das mit zunehmender Anzahl der TImages sehr langsam.

Lade ich dagegen jedes Mal die Grafik neu von der Festplatte, dann ist das richtig fix.

Ich kann mir aber absolut keinen Reim darauf machen, warum die Festplatte schneller sein sollte als der Arbeitsspeicher. Daher die Frage: Warum ist das so? Sind das irgendwelche Besonderheiten der TImagelist oder...?
Würde dieses Phänomen einfach gerne verstehen :-)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
Tiles: array of array of TImage
imagelist1 : TImagelist
tile_std : String (Pfad zur Grafik)
....
----------

for iy:=0 TO maxy DO
    for ix:= 0 TO maxx DO
      BEGIN
        IF Tiles[ix,iy] = nil then begin
          Tiles[ix,iy] := TImage.Create(form1);
          Tiles[ix,iy].parent := form1;
          Tiles[ix,iy].Stretch := true;
          Tiles[ix,iy].OnClick := ImageClick;
          Tiles[ix,iy].PopupMenu := PopupMenu1;
        END;

        Tiles[ix,iy].left := ix * DX;
        Tiles[ix,iy].top  := iy * DY;
        Tiles[ix,iy].Height := DY;
        Tiles[ix,iy].Width  := DX;

        imagelist1.GetBitmap(0,  Tiles[ix,iy].Picture.Bitmap);  // Langsam

       // Tiles[ix,iy].Picture.LoadFromFile(tile_std);  // Schnelle Alternative mit Festplattenzugriff

_________________
Delphi: XE - OS: Windows 7 Professional x64
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19339
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 16.03.11 18:09 
Wenn du eine TImageList benutzt, wird das Bild aus der ImageList erst auf deine Bitmap gezeichnet. Und ich weiß nicht wie die Bilder intern ablegt werden, da Windows das selbst macht, aber ich habe im Hinterkopf, dass die auf eine große Bitmap gezeichnet werden und dann da rauskopiert. Das dauert eben kurz.

Deshalb habe ich eine Cache-Klasse erstellt, die die Bilder lädt, wenn sie noch nicht da sind und die Bilder bis zu einer bestimmten Arbeitsspeicherauslastung im Speicher hält. Wenn dann ein neues angefragt und geladen wird, wird ggf. ein altes freigegeben, wenn zu viel Speicher schon belegt ist.