我目前正在使用窗体上的paint事件将图像绘制到屏幕上。(想想背景图像)和一些矩形在这个图像的顶部。
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,然后停止绘制到窗体,并在失败的绘制的图片上显示带红色十字的白色背景。
我对它为什么跑得这么糟糕感到有点不知所措。我刚开始使用paint事件绘图,所以任何帮助都将不胜感激!
发布于 2013-01-02 13:25:08
Image为IDisposable,因此您应该在"using“块中执行DrawImage调用,以确保释放图像。
但最重要的是,我会重新考虑在Paint事件中执行大量IO操作。可能会提前加载图像,让Paint事件只关心绘图。您当前正在数百次加载相同的图像。
发布于 2013-01-02 13:02:56
我认为如果你的UI线程经常被使用,那么终结器就会被阻塞。对象可能是垃圾回收的,但可处理的对象将被添加到终结器队列中。终结器在UI线程中运行,所以如果UI线程很忙,dispose就不会被调用。图形对象通常包装一个非托管对象,该对象需要使用dispose()进行清理。
当你完成绘画时,我会手动处理所有与图形相关的对象。
https://stackoverflow.com/questions/14078399
复制相似问题