簡體   English   中英

TBitmap到TPngImage和內存使用情況

[英]TBitmap to TPngImage and Memory usage

我有一個11個白色TBitmaps(32位512x512像素= 1 MB)的數組,我想將它們分配給TPngImage數組以減少內存使用量,我希望1 mb白色位圖變為1.76 KB png並且內存使用率大幅下降我用任務管理器監控它,差異只有0.824 MB,為什么會這樣? 什么是在內存中無損壓縮TBitmaps的最佳/快速方法?


for I := 0 to 10 do
begin
  Bitmaps[I] := TBitmap.Create;
  Bitmaps[I].PixelFormat := pf32bit;
  Bitmaps[I].Canvas.Pen.Color := clWhite;
  Bitmaps[I].SetSize(512,512);
  Bitmaps[I].Canvas.Rectangle(0,0,512,512);
end;

for I := 0 to 10 do begin Pngs[I] := TPngImage.Create; Pngs[I].Assign(Bitmaps[I]); Bitmaps[I].Free; end;


更新

形式@bummi研究我認為最好的辦法是將png保存在一個內存流數組中,這相差9.7 MB。


for I := 0 to 10 do
begin
  Png :=  TPngImage.Create;
  Png.Assign(Bitmaps[I]);
  Streams[I] := TMemoryStream.Create;
  Png.SaveToStream(Streams[I]);
  Bitmaps[I].Free;
  Png.Free;
end;

當您發布TBitmap時,您發布了兩件事:

  • 內存到FastMM4 Delphi堆管理器
  • HBITMAP Windows GDI句柄

有時Windows會縮小工作集,如果您最小化所有程序的窗口然后恢復它們,但它不會被授予。 由於今天相對較小的10MB差異而重新安排進程內存不會減速。

閱讀更多信息,請訪問https://stackoverflow.com/a/14380287/976391

http://fastmm.sourceforge.net/附帶自述文件和演示如何測量進程內存使用情況,如果它讓你好奇。

但如果你真的想減少RAM的使用 - 那就不要分配它。 只需制作一個TBitmap並從中分配al PNG。 盡管如此,你的寡婦明確表示10MB不是值得關注的數字。


另外,正如user539848所發現的那樣,你有11個位圖,而不是10.為了避免逐個錯誤,你最好不要使用神奇的常量,而是使用可靠的編譯器結構。

for I := Low(Bitmaps) to High(Bitmaps) do
begin
  Bitmaps[I] :=...

TPngImage保持所有像素准備就緒並解壓縮,以便能夠快速消除它們。 TPngImage占用的內存大小與TBitmap大致相同。

因此,只需將位圖分配給TPngImage就可以復制數據。 因此,在釋放位圖后,程序將最終使用相同數量的內存。

如果您希望內存使用率降至1.76 KB png,則必須將PNG壓縮為內存流並釋放TPngImage,如更新中的代碼所示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM