2

現在、フォームでペイントイベントを使用して、画面に画像を描画しています。(背景画像を考えてください)そしてこの画像の上にあるいくつかの長方形。

 private void MainWindow_Paint(object sender, PaintEventArgs e)
 {
    e.Graphics.Clear(Color.CornflowerBlue);
    e.Graphics.DrawImage(Image.FromFile(m_Directory + @"\Images\" + BackgroundText), m_Screen);
    e.Graphics.FillRectangle(BGBrush, new Rectangle(X, Y, Width, Height));
    e.Graphics.DrawString(Text, Settings.TextFont, Other.Settings.TextBrush, new Rectangle(X, Y + 2, Width, Height));
 }

ページは非常に頻繁に (ほぼすべてのマウス移動イベントで) 再描画され、大量のメモリが使用されています。フォームへの描画を停止する前に 1,500,000k に到達し、失敗したペイントの画像に赤い十字が付いた白い背景を表示します。

どうやってそんなにひどく走っているのか、私は少し途方に暮れています。私はペイントイベントで描くのが初めてなので、どんな助けでも大歓迎です!

4

2 に答える 2

1

ImageisIDisposableであるため、「using」ブロック内で DrawImage 呼び出しを実行して、Image が確実に破棄されるようにする必要があります。

しかし、最も重要なことは、Paint イベントで大量の IO 操作を行うことを再考することです。Paint イベントが描画のみを考慮するようにするために、画像を事前にロードしておくことができます。現在、同じ画像を何百回も読み込んでいます。

于 2013-01-02T05:25:07.957 に答える
0

UIスレッドが常に使用されていると、ファイナライザーがブロックされると思います。オブジェクトはガベージ コレクションされる可能性がありますが、破棄可能なオブジェクトはファイナライザー キューに追加されます。ファイナライザーは UI スレッドで実行されるため、UI スレッドがビジー状態の場合、dispose は呼び出されません。グラフィックス オブジェクトは通常、管理されていないオブジェクトをラップし、そのオブジェクトは dispose() でクリーンアップする必要があります。

ペイントが完了したら、グラフィック関連のオブジェクトをすべて手動で破棄します。

于 2013-01-02T05:02:56.313 に答える