Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Warum brauchen BitBlt und StretchBlt soviel Speicher? (https://www.delphipraxis.net/205822-warum-brauchen-bitblt-und-stretchblt-soviel-speicher.html)

Harry Stahl 20. Okt 2020 18:31

Warum brauchen BitBlt und StretchBlt soviel Speicher?
 
Gerade bin ich auf eine interessante Sache gestoßen: Wenn ich irgendwo eine Bitmap mit BitBlt oder StretchBlt verwende, wird dafür nochmal die gleiche Größe im Arbeitsspeicher erzeugt, wie die Bitmap selber hat.

Beispiel: Lade ich eine 21.600 x 10.800 große Grafik in mein Programm und habe dabei vorgegeben, dass die Grafik in 100% Größe angezeigt wird (in einer Paintbox - und ich dann für die Anzeige Paintbox.canvas.draw (x,y, Bitmap) verwende), dann braucht mein Programm nur 700 MB Arbeitsspeicher.

Lasse ich das Bild mit Stretchblt in einer anderen skalierten Größe anzeigen (oder auch in 100% aber mit BitBlt die Bitmap auf das Paintbox.handle kopiert), dann werden 1,4 GB Arbeitsspeicher benötigt.
Ich bin da wirklich mit dem Debugger durch, bei Aufruf von StretchBlt erhöht sich die Anzeige im Taskmanager von 700 MB auf 1,4 MB.

Anscheinend legt StretchBlt irgendwie Speicher für diese Bitmap an, gibt ihn nachher aber nicht mehr frei (ein erneuter Aufruf von Stretchblt führt aber nicht zu weiteren Speicherverbräuchen).

Gibt es eine Möglichkeit, diesen verbrauchten Speicher wieder zurückzusetzen?

Ich bin dabei darauf gestoßen, nachdem ich alle Undo-Einstellungen in meinem Programm deaktiviert hatte und trotzdem noch der Doppelte Arbeitsspeicher benötigt wurde, als die Bitmap rein rechnerisch benötigen würde.

himitsu 20. Okt 2020 18:38

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?
 
Windows Imaging Component (WIC) im TWICImage braucht fast nichts, denn es wurde etwas mehr auf Arbeiten mit wenig Speicher ausgelegt.
(die verarbeiten dort solche Operationen standardmäßig Blockweise, in kleineren Stückchen)

Allerdings betrifft das nicht die Implementierung im Delphi, denn die ist grauenhaft und man sollte vorallem beim Stretch die nötigen Interfaces selbst ansteuern.
Besonders "schlecht" zu merken, wenn man ein TPNGImage mit StretchDraw zeichnen will, da es intern über TBitmap läuft. (PNG wird erst komplett auf ein TBitmap gemalt und dann erst gestetcht)
https://docs.microsoft.com/en-us/win...c-codec-ifaces

Harry Stahl 20. Okt 2020 18:51

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?
 
Meine Frage war, ob man das wieder irgendwie zurücksetzen kann (außer das Bitmap direkt wieder freigeben)....

himitsu 20. Okt 2020 22:13

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?
 
Versuch mal Bitmap.FreeImage

In TBitmap und den anderen TGraphic gibt es teils mehrere Handles/DIB/usw.,
siehe z.B. im TBitmapImage (Vcl.Graphics), was im TBitmap verwendet wird.

TurboMagic 21. Okt 2020 19:28

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?
 
Zitat:

Zitat von himitsu (Beitrag 1475826)
Allerdings betrifft das nicht die Implementierung im Delphi, denn die ist grauenhaft und man sollte vorallem beim Stretch die nötigen Interfaces selbst ansteuern.
Besonders "schlecht" zu merken, wenn man ein TPNGImage mit StretchDraw zeichnen will, da es intern über TBitmap läuft. (PNG wird erst komplett auf ein TBitmap gemalt und dann erst gestetcht)
https://docs.microsoft.com/en-us/win...c-codec-ifaces

Was davon ist schon in QP erfasst?


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