2012-12-29 2 views
2

현재 양식에 페인트 이벤트를 사용하여 화면에 이미지를 그립니다. (배경 이미지라고 생각하십시오) 및이 이미지 위에 사각형이 있습니다. PaintEvent 메모리 누수

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

그림판 이벤트 대신 프로그램의 다른 부분에 이미지를 만들어보십시오. 또한 Gobj는 어디에서 생성되었으며, Graphics 객체처럼 보입니다. 대신 PaintEventArgs Graphics 객체를 사용하십시오. –

+0

죄송합니다, Gobj는 egraphics에서 비롯되었지만 다른 함수로 전달되었습니다. 원문은 이제 보통의 그래프를 사용하여 그것을 보여줍니다. 나는 다른 부분 덕분에 이미지를 만들려고 노력할 것입니다! 그것이 작동하는 경우 나중에 회신 해! – DStow

+0

내가 Graphics 객체에 대해 묻는 이유는 하나를 만들면 반드시 펜과 같은 객체와 함께 처리해야하기 때문입니다. –

답변

1

ImageIDisposable이므로 "사용"블록 내에서 DrawImage 호출을 실행하여 이미지가 삭제되지 않도록해야합니다.

하지만 가장 중요한 것은 페인트 이벤트에서 과도한 IO 작업을 재검토하는 것입니다. 페인트 이벤트가 그리기에 대해서만 염려 할 수 있도록 미리로드 된 이미지가있을 수 있습니다. 현재 동일한 이미지를 수백 번로드하고 있습니다.

0

UI 스레드가 지속적으로 사용 중이라면 종료 기가 차단 될 것이라고 생각합니다. 개체가 가비지 수집 될 수 있지만 처분 할 수있는 개체가 finalizer 큐에 추가됩니다. finalizer는 UI 스레드에서 실행되므로 UI ​​스레드가 사용 중이면 호출하지 마십시오. 그래픽 객체는 대개 관리되지 않는 객체를 래핑하며 해당 객체는 dispose()를 사용하여 정리해야합니다.

페인팅을 완료하면 모든 그래픽 관련 개체를 수동으로 처리합니다.