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

ImageIDisposable,因此您应该在“使用”块中执行 DrawImage 调用,以确保处理图像。

但最重要的是,我会重新考虑在 Paint 事件中执行繁重的 IO 操作。可能提前加载图像,让 Paint 事件只担心绘图。您当前正在加载相同的图像数百次。

于 2013-01-02T05:25:07.957 回答
0

我认为如果你的 UI 线程一直在使用,终结器将被阻塞。这些对象可能会被垃圾回收,但可处置的对象将被添加到终结器队列中。终结器在 UI 线程中运行,因此如果您的 UI 线程很忙,则不会调用 dispose。图形对象通常包装一个非托管对象,并且该对象需要使用 dispose() 进行清理。

完成绘画后,我会手动处理所有与图形相关的对象。

于 2013-01-02T05:02:56.313 回答