![]() |
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:
Gibt es eine Möglichkeit das zu beschleunigen?
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; Evtl. aus der resource zuerst einen MemoryStream (ms) der gesamten Resourcen zu erzeugen und diesen dann iwie per "aBmp.LoadFromStream (ms)" auszulesen? vG Martin |
AW: Effizientes extrahieren von Resourcen
LoadFromResourceName erstellt internen bereits einen
![]() 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 ![]() 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. |
AW: Effizientes extrahieren von Resourcen
Ich kann mir vorstellen, dass Format() die meiste Zeit kostet.
Wird immerhin 250 Mal aufgerufen. Frank |
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. |
AW: Effizientes extrahieren von Resourcen
Zitat:
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 |
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 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz