2012-10-10 5 views
0

제 접근 방식의 문제는 이미지, 텍스트 또는 선을 그릴 때 양식의 크기를 조정할 때 0.2 초 정도 뒤떨어집니다. 따라서 오른쪽 하단에 이미지가 필요하면 크기를 조정 한 후 0.2 초가 소요됩니다. 또한 과도한 크기 조정을 수행하는 경우, 양식이 큰 화면으로 확장되는 동안 1-2FPS까지 지연되기 시작합니다. 샘플 코드는 다음과 같습니다 (VB.NET) :lags없이 양식에 그래픽을 그립니까?

Public Class Form1 
    Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) 
    MyBase.OnPaint(e) 
    Dim icon As Icon = SystemIcons.Exclamation 
    Dim imageWidth As Integer = icon.Width 
    Dim imageHeight As Integer = icon.Height 
    e.Graphics.DrawIcon(icon, Me.ClientRectangle.Right - imageWidth, 
           Me.ClientRectangle.Bottom - imageHeight) 
    End Sub 
    Private Sub Form1_Resize(sender As Object, e As System.EventArgs) Handles Me.Resize 
    Me.Invalidate() 
    End Sub 
End Class 

더 부드럽게하기 위해 할 수있는 일이 있습니까?

+1

게시 한 코드에 눈에 띄는 지연이 없습니다. –

+0

@ JohnKoerner : 이상한 부분은 동일한 Windows 7을 실행하는 5 배 느린 컴퓨터에서 시도했지만 눈에 띄는 지연도 없었습니다. 그래서 현재는 문제가되는 것이 제 i7입니다. 나는 어떤 패턴을 발견하면 더 많은 테스트를하고 질문을 업데이트 할 것입니다. – Neolisk

+0

'Invalidate()'를'Refresh()'로 바꾸어보십시오. – ja72

답변

1

창의 크기를 조정하면 항상 새 위치에서 이미지를 다시 그립니다. 그러나 재사용을보다 효율적으로 할 수도 있고 시도하지 않을 수도있는 몇 가지 방법이 있습니다.

  1. 전체 양식이 아니라 이미지의 이전 위치와 새 위치 만 무효화하십시오. 즉, 변경되지 않는 창의 부분을 칠할 필요가 없습니다.
  2. 이미지를 이전 위치에서 새 위치로 복사하십시오. 특히 창 크기가 작아지고 이전 이미지 영역과 새 이미지 영역이 겹쳐지면 창의 오른쪽 부분을 무효화하려면 여기를주의해야합니다.
  3. 이미지에 대한 별도의 컨트롤을 만들고 컨트롤을 올바른 위치로 이동하십시오. 폼과 컨트롤은 자동으로 올바른 영역을 무효화합니다.
+0

또한 paintEventArgs에는 다시 그리기가 필요한 실제 비트를 식별하는 "유효하지 않은"rect가 있습니다. 이것은 필요한 렌더링을 더 제한하기 위해 종종 사용될 수 있습니다. –

+0

나중에 다시 칠할 것으로 예상되는 지역을 무효화하는 방법에 대해 자세히 설명해 주시겠습니까? Resize 이벤트를 사용하여 페인트하는 데 사용하는 동일한 사각형을 사용했지만 그 시점에서 모든 것이 이미 발생했기 때문에 Resize보다 먼저해야합니다. 재정의하고 Mybase.Paint 전에 넣으려고했지만 여전히 똑같습니다. 크기를 조정할 때 이미지의 흔적이 보입니다. 얼마나 큰 흔적은 얼마나 빨리 크기를 조정하는지에 달려 있습니다. – Neolisk

+0

@ 노리스크 이전에 그린 영역을 저장해야 무효화 할 수 있으므로 이미지를 페인트하고 무효화 할 위치로 업데이트해야한다고 생각합니다. – Neil

2

Windows Forms은 화면을 이중 버퍼링하기 위해 style setting을 제공합니다. 이것은 당신을 위해 많은 셋업을합니다.

또한 이중 버퍼링 어쨌든 볼 수 없습니다 많은 일을 방지 할 기본 클래스를 호출없이 그렇게 OnPaintBackground 최우선과 를 돌려 화면을 취소 할 필요를 제거한다.

GDI +/winforms 이중 버퍼링의 가장 좋은 예제 중 일부는 내 animationexamples을 확인하십시오.

+0

Form.DoubleBuffered를 사용하는 것과 같은가요? – Neolisk

+0

네, 그들은 같은 것을 설정하는 모든 방법입니다. 폼 초기화 코드에서 메서드를 호출하거나 스타일을 명시 적으로 설정할 수 있습니다. –

+0

'DoubleBuffered' 시도 - 문제를 해결하지 못했습니다. 사실, 아무도이 제안을 할 때마다 도움이되지 않았습니다. :) – Neolisk

관련 문제