3

11 個の白い TBitmap (32 ビット 512x512 ピクセル = 1 MB) の配列があり、それらを TPngImage 配列に割り当ててメモリ使用量を減らしたいと考えています。タスク マネージャーで監視したところ、わずか 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;


アップデート

Form @bummi research 私が行う最善の方法は、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;

4

2 に答える 2

1

TBitmap をリリースしたとき、次の 2 つをリリースしました。

  • メモリから FastMM4 Delphi ヒープ マネージャへ
  • HBITMAP Windows GDI ハンドル

プログラムのすべてのウィンドウを最小化してから元に戻すと、Windows がワーキング セットを縮小することがありますが、それは認められません。今日の 10MB の差は比較的小さいため、プロセス メモリを再配置しても、無駄に速度が低下することはありません。

https://stackoverflow.com/a/14380287/976391の回答から詳細を読む

http://fastmm.sourceforge.net/には、プロセス内のメモリ使用量を測定する方法の readme とデモが付属しています。

しかし、本当に RAM の使用量を減らしたい場合は、割り当てないでください。1 つの TBitmap を作成し、そこからすべての PNG を割り当てるだけです。繰り返しになりますが、あなたの未亡人は、10MB は気にする必要のない数字だとはっきり言いました。


また、user539848 が発見したように、10 ではなく 11 のビットマップがあります。off-by-one エラーを回避するには、魔法の定数を使用せず、信頼できるコンパイラ構造を使用することをお勧めします。

for I := Low(Bitmaps) to High(Bitmaps) do
begin
  Bitmaps[I] :=...
于 2013-04-25T16:36:46.600 に答える
0

TPngImage は、すべてのピクセルをすぐにペイントできるようにするために、すべてのピクセルを準備してアンパックした状態に保ちます。TPngImage は、TBitmap とほぼ同じ量のメモリを必要とします。

したがって、TPngImage にビットマップを割り当てるだけで、データがコピーされるだけです。したがって、ビットマップを解放した後、プログラムは同じ量のメモリを使用することになります。

メモリ使用量が 1.76 KB png に低下すると予想される場合は、アップデートのコードと同様に、PNG をメモリ ストリームに圧縮し、TPngImage を解放する必要があります。

于 2016-10-29T17:03:52.227 に答える