![]() |
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. |
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) ![]() |
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)....
|
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. |
AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:13 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