Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Delphi .RES Resourcen - grundsaetzliche Funktionsweise (https://www.delphipraxis.net/201059-delphi-res-resourcen-grundsaetzliche-funktionsweise.html)

hzzm 19. Jun 2019 13:09

Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Wie kann ich mir die Funktionsweise der Delphi Resourcen grundsaetzlich vorstellen, wenn ich eine Bild-Datei daraus lade:
Delphi-Quellcode:
var
  LPng: TPngImage;
begin
  LPng := TPngImage.Create;
  LPng.LoadFromResourceName(HInstance, AImageName);
end;
Wird hier die Datei von der Festplatte aus Speicherbereichen der .exe geladen, oder werden die Resourcen beim Laden mit
Delphi-Quellcode:
{$R *.res}
bereits in den Arbeitsspeicher geladen?

http://docs.embarcadero.com/products...efile_xml.html
oder
http://docwiki.embarcadero.com/RADSt...ces_and_Images
erklaeren leider nicht die grundsaetzliche Funkntionsweise :roll:

Neutral General 19. Jun 2019 13:22

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Eingebundene .res Dateien werden in die .exe einkompiliert und da die exe komplett in den Speicher geladen wird, werden die Resource in der .exe auch aus dem Speicher geladen.
{$R *.res} macht zur Laufzeit übrigens gar nichts, bzw. es existiert gar nicht mehr. Das ist nur ein Hinweis für den Compiler diese Datei schon beim Kompilieren in die .exe mit einzubinden.

Redeemer 19. Jun 2019 21:09

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Die EXE wird immer komplett in den Speicher geladen?

peterbelow 20. Jun 2019 12:07

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Zitat:

Zitat von Redeemer (Beitrag 1435056)
Die EXE wird immer komplett in den Speicher geladen?

Nein, nicht wirklich. Windows verwendet hier seine virtuelle Speicherverwaltung: Die Datei wird (wie ein memory mapped file) mit einem Speicherbereich im Addressraum des Prozesses verknüpft. Der ist in Seiten fester Größe aufgeteilt, und wenn auf eine Addresse zugegriffen wird wird die Seite (wenn noch nicht geschehen) aus der Datei in den physischen Arbeitsspeicher geladen. Es werden also aus einer Programmdatei (oder DLL) nur die Teile geladen, die auch verwendet werden.

Luckie 20. Jun 2019 14:23

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
http://michael-puff.de/Programmierun...nagement.shtml

hzzm 27. Jun 2019 14:37

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Vielen Dank an alle fuer die nuetzlichen Informationen!

Da die Antworten aber so detailiert sind, stellt sich mir weiterhin die Frage:

Wenn ich alle Bild-Resourcen (.png's) beim Programmstart aus den Resourcen in eine Feldvariable TImageList o.ae. lade, laden diese dann beim Anfragen der Bilddaten beim ersten mal schneller als mit LoadFromResourceName?

Zitat:

Zitat von peterbelow (Beitrag 1435083)
Zitat:

Zitat von Redeemer (Beitrag 1435056)
Die EXE wird immer komplett in den Speicher geladen?

Nein, nicht wirklich. Windows verwendet hier seine virtuelle Speicherverwaltung: Die Datei wird (wie ein memory mapped file) mit einem Speicherbereich im Addressraum des Prozesses verknüpft. Der ist in Seiten fester Größe aufgeteilt, und wenn auf eine Addresse zugegriffen wird wird die Seite (wenn noch nicht geschehen) aus der Datei in den physischen Arbeitsspeicher geladen. Es werden also aus einer Programmdatei (oder DLL) nur die Teile geladen, die auch verwendet werden.

Also werden die .RES-Inhalte vor Erst-Verwendung direkt in den RAM geladen, weil aufgrund der ASM-Zugriffe klar wird, dass sie spaeter eh gelesen werden, oder landen sie erst in der Pagefile und beim Erstzugriff dann im RAM?

peterbelow 27. Jun 2019 16:09

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Zitat:

Zitat von hzzm (Beitrag 1435504)
Vielen Dank an alle fuer die nuetzlichen Informationen!

Da die Antworten aber so detailiert sind, stellt sich mir weiterhin die Frage:

Wenn ich alle Bild-Resourcen (.png's) beim Programmstart aus den Resourcen in eine Feldvariable TImageList o.ae. lade, laden diese dann beim Anfragen der Bilddaten beim ersten mal schneller als mit LoadFromResourceName?

Es ist völlig egal, wann Du die Resource lädst; der erste Zugriff lädt sie ins RAM und beim nächsten kann es dann sehr viel schneller gehen. Es gibt keine Art von prefetch oder so, Windows kann doch nicht wissen, wann, oder ob überhaupt, eine Resource verwendet wird. Das würde ja eine vollständige Analyse des Programms erfordern, und das wäre trotzdem zumeist für die Katz, da ein Programm mit Benutzerinteraktion eine Vielzahl von möglichen "Pfaden" durch den Kode hat, je nach Aktionen des Benutzers. Branch execution prediction machen die modernen CPUs nur in einem sehr limitierten Scope mit dem Inhalt der CPU Cache, das ist nicht Aufgabe des Betriebssystems.

Uwe Raabe 27. Jun 2019 16:23

AW: Delphi .RES Resourcen - grundsaetzliche Funktionsweise
 
Zitat:

Zitat von hzzm (Beitrag 1435504)
Wenn ich alle Bild-Resourcen (.png's) beim Programmstart aus den Resourcen in eine Feldvariable TImageList o.ae. lade, laden diese dann beim Anfragen der Bilddaten beim ersten mal schneller als mit LoadFromResourceName?

Das hört sich jetzt so an, als steckt ein konkretes Performance-Problem hinter deiner allgemein gehaltenen Frage. Dass die TImageList explizit aus einer Resource geladen wird, könnte auch ein Zeichen einer grundsätzlich falschen Herangehensweise sein.


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