Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Effizientes extrahieren von Resourcen (https://www.delphipraxis.net/205683-effizientes-extrahieren-von-resourcen.html)

MartinK 5. Okt 2020 18:52

Effizientes extrahieren von Resourcen
 
Ich gebe meinem Programm via *.RES Datei eine größere Anzahl an Bitmaps mit.
Diese werden beim "Create" des Hauptformulars in verschieden ImageLists "extrahiert"
(Grund dafür ist dass das statisches Einbinden der Bitmaps in die Imagelist bei einigen Anwendern leider zu Fehlern führt).

Das extrahieren der Resourcen, ca 250 kleinere Bitmaps dauert allerdings beim Programmstart jeweils fast 5 Sekunden.... die ich gerne einsparen würde.


Aktuell lade ich die resourcen per "LoadFromResourceName" was evtl. nicht der schnellste Weg ist, oder?
Delphi-Quellcode:
Var
  ResourceNameStr : String;
  aBmp : TBitmap;

begin
  for I:= 0 to 249
    do begin
         ResourceNameStr := 'PicIdentifier' + format('%.3d',[I]);
         try
           aBmp.LoadFromResourceName(HInstance,ResourceNameStr);
           ILSaltTypeRes  .Add(aBmp, nil);
         Except
         end;
       end;
.....

end;
Gibt es eine Möglichkeit das zu beschleunigen?
Evtl. aus der resource zuerst einen MemoryStream (ms) der gesamten Resourcen zu erzeugen und diesen dann iwie per "aBmp.LoadFromStream (ms)" auszulesen?


vG Martin

himitsu 5. Okt 2020 20:20

AW: Effizientes extrahieren von Resourcen
 
LoadFromResourceName erstellt internen bereits einen Delphi-Referenz durchsuchenTResourceStream und lädt dann daraus.

Bei der VCL-TImageList wird intern alles als ein großes Bitmap gespeichert.
Heißt, aus deinen vielen kleinen Bitmaps wird "schrittweise" ein Großes.
Das liegt aber nicht an der VCL, sondern an der Windows-Komponente, welche da intern verwendet wird.

Über Delphi-Referenz durchsuchenTImageList.AllocBy kann man das Speichermanagement etwas verbessern,
oder man lädt das "ganze" Bitmap auf einmal. (weiß jetzt aber nicht wie das ginge, aber man kann ja in der DFM schauen in welchem Property liegt und schaut sich das dann im Quellcode der ImageList an)



Die ImageListen des FMX arbeiten da anders, auch intern jeweils mit EinzelBildern.

dataspider 6. Okt 2020 09:16

AW: Effizientes extrahieren von Resourcen
 
Ich kann mir vorstellen, dass Format() die meiste Zeit kostet.
Wird immerhin 250 Mal aufgerufen.

Frank

himitsu 6. Okt 2020 09:36

AW: Effizientes extrahieren von Resourcen
 
Format verbraucht nicht so viel Zeit, wie man denken könnte, da es intern mit einem statischen Buffer auf dem Stack arbeitet.
Viel weniger arbeit mit der Speicherverwaltung, aber dafür eine begrenze Länge. (bei unter 4096 Chars, bzw. im Android unter 512 Chars)

Da wäre es ne Millisekunde effektiver auch noch den ersten/anderen String in den Formatstring zu verschieben und so noch zwei große String-Operationen einzusparen.


Aber gegen das das ganze Gerödel, mit den Bitmaps, ist das garnichts.

dataspider 6. Okt 2020 10:24

AW: Effizientes extrahieren von Resourcen
 
Zitat:

Zitat von himitsu (Beitrag 1474946)
Aber gegen das das ganze Gerödel, mit den Bitmaps, ist das garnichts.

Kann durchaus sein, dass mit neueren Delphi - Versionen auch Format() optimiert wurde.

Ich hatte damals (XE 6) vor dem Öffnen einer Query eine Schleife über Fields und dort jeweils 1 Format().
Ich kann mich erinnern, dass das Öffnen der Query lange dauerte.
Nachdem ich das Format('irgendwas %s', ['nochwas']) gegen 'irgendwas ' + 'nochwas' getauscht hatte, war alles schick.

Ist halt in meinem Hirn manifestiert: In Schleifen -> vermeide Format()

Frank

MartinK 6. Okt 2020 19:26

AW: Effizientes extrahieren von Resourcen
 
1000 Dank für die vielen guten Hinweise.
ich habe das daraufhin jetzt mal mit gettickcount "ausgemessen".


Resultat:
- weder das von mir vermutete "LoadFromResourceName" NOCH "Format" benötigen namhaft Resourcen.
Beide erledigen ihren Job innerhalb einer ms !
- Übeltäter ist eine (im obrigen Sourcecode von mir nicht erwähnte aber bei manchen Resourcen verwendete) weitere Routine
welche mir die Bitmaps auf eine kleinere Version mit weniger Pixeln "runterskaliert"


WOW, darauf wäre ich im Leben nicht gekommen.
Das zeigt mal wieder wie wertvoll solche Forenantworten sein können

vG Martin


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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