2012-05-31 34 views
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; 
} 

当我使用Timer并调用Draw()方法每隔300毫秒一切正常,但是当我看看进程管理器,我的项目使用更多的内存(内存每增加300毫秒)为什么使用的内存量增加了?

也许我应该使用垃圾收藏家或使用p = null;等。我该如何解决这个问题?

感谢您的帮助和抱歉,我的英语不好..

+0

旁注:你正在创建本地随机数生成器,而不是使用共享的一个。在这种情况下可以(因为Draw的调用间隔超过10-20ms),但检查你的其他代码是否类似的Random里面经常调用的方法的创建... –

回答

4

你永远不设置你的Graphics对象。

使用using,如:

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

另外,不要创造新的Bitmap每一帧的一个品牌。将旧的保存在一个成员变量中,然后在下次调用时将其绘制。如果屏幕尺寸发生变化,请只制作一个新的(Screen.PrimaryScreen.Bounds != image.Size)。

+0

应该处理'Bitmap'以及吗? – mellamokb

+3

@mellamokb:他应该做一些事情来避免创建一堆未配置的'Bitmap'对象,但重用前一个可能比将它放置在一个'PictureBox'时更好。 –

相关问题