AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Warum brauchen BitBlt und StretchBlt soviel Speicher?

Warum brauchen BitBlt und StretchBlt soviel Speicher?

Ein Thema von Harry Stahl · begonnen am 20. Okt 2020 · letzter Beitrag vom 21. Okt 2020
Antwort Antwort
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
1.976 Beiträge
 
Delphi 10.4 Sydney
 
#1

Warum brauchen BitBlt und StretchBlt soviel Speicher?

  Alt 20. Okt 2020, 19:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.207 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?

  Alt 20. Okt 2020, 19:38
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (20. Okt 2020 um 19:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
1.976 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?

  Alt 20. Okt 2020, 19:51
Meine Frage war, ob man das wieder irgendwie zurücksetzen kann (außer das Bitmap direkt wieder freigeben)....

Geändert von TBx (22. Okt 2020 um 08:36 Uhr) Grund: Fullquote entfernt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
37.207 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?

  Alt 20. Okt 2020, 23:13
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
1.180 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Warum brauchen BitBlt und StretchBlt soviel Speicher?

  Alt 21. Okt 2020, 20:28
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?
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf