我有一个11个白色TBitmap(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;
答案 0 :(得分:1)
当您发布TBitmap时,您发布了两件事:
如果你最小化所有程序的窗口然后恢复它们,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] :=...
答案 1 :(得分:0)
TPngImage保持所有像素准备就绪并解压缩,以便能够快速消除它们。 TPngImage占用与TBitmap大致相同的内存量。
因此,只需将位图分配给TPngImage就可以复制数据。因此,在释放位图后,程序将最终使用相同数量的内存。
如果您希望内存使用率降至1.76 KB png,则必须将PNG压缩为内存流并释放TPngImage,就像更新中的代码一样。