3
private void Draw(){
     int width  = Screen.PrimaryScreen.Bounds.Width;
     int height = Screen.PrimaryScreen.Bounds.Height;
     Bitmap image= new Bitmap(width, height);
     Graphics gr =  Graphics.FromImage(image);
     gr.CopyFromScreen(0, 0, 0, 0, new Size(width, height));
     Random rnd = new Random();

     gr.DrawEllipse(new Pen(Color.Red, rnd.Next(100)), rnd.Next(300), rnd.Next(100), rnd.Next(600), rnd.Next(1000));
     Point[] p = new Point[3];
     p[0] = new Point(rnd.Next(30),  rnd.Next(60));
     p[1] = new Point(rnd.Next(100), rnd.Next(260));
     p[2] = new Point(rnd.Next(30),  rnd.Next(10));
     gr.DrawPolygon(Pens.AliceBlue, p);
     gr.DrawBeziers(Pens.Yellow, p);
     pcImageBox.Image = image;
}

300ミリ秒ごとにメソッドを使用Timerして呼び出すと、Draw()すべて正常に機能しますが、プロセスマネージャーを調べると、プロジェクトはより多くのメモリを使用します(メモリは300ミリ秒ごとに増加します)

ガベージコレクタを使用するか、p = null;などを使用する必要があるかもしれません。この問題を解決するにはどうすればよいですか?

助けてくれてありがとう、私の悪い英語でごめんなさい..

4

2 に答える 2

5

Graphicsオブジェクトを破棄したことはありません。

using次のように使用します。

using (Graphics gr =  Graphics.FromImage(image)) {
     ...
}
pcImageBox.Image = image;

Bitmapまた、フレームごとに新しいものを作成しないでください。古いものをメンバー変数に保存し、次の呼び出し時にそれを上書きします。画面サイズが変わった場合のみ作成してください(Screen.PrimaryScreen.Bounds != image.Size)。

于 2012-05-31T23:00:02.210 に答える
0

あなたが望むもののためのより良い方法は次のようになります:

BufferedGraphics

于 2012-06-01T04:03:26.587 に答える