AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Effizientes extrahieren von Resourcen

Ein Thema von MartinK · begonnen am 5. Okt 2020 · letzter Beitrag vom 6. Okt 2020
Antwort Antwort
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

Effizientes extrahieren von Resourcen

  Alt 5. Okt 2020, 18:52
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
Martin Kuhn
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: Effizientes extrahieren von Resourcen

  Alt 5. Okt 2020, 20:20
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Okt 2020 um 20:26 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Effizientes extrahieren von Resourcen

  Alt 6. Okt 2020, 09:16
Ich kann mir vorstellen, dass Format() die meiste Zeit kostet.
Wird immerhin 250 Mal aufgerufen.

Frank
Frank Reim
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

AW: Effizientes extrahieren von Resourcen

  Alt 6. Okt 2020, 09:36
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 6. Okt 2020 um 09:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Effizientes extrahieren von Resourcen

  Alt 6. Okt 2020, 10:24
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
Frank Reim
  Mit Zitat antworten Zitat
MartinK

Registriert seit: 21. Jun 2009
Ort: Germering (Germany)
89 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Effizientes extrahieren von Resourcen

  Alt 6. Okt 2020, 19:26
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
Martin Kuhn
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:10 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