2011-11-04 4 views
0

사용자가 모양을 그리는 응용 프로그램이 있습니다. 도형 위로 클릭하고 드래그하면 MouseMove 내부의 Invalidate()로 인해 CPU가 100 % 이동합니다. 타이머를 사용하고 틱 이벤트에서 Invalidate()를 호출하면 움직이는 것이 원활하지 않습니다. CPU를 최소화하고 원활하게 움직이는 다른 방법이 있습니까?CPU 사용량이 많은 GDI 그리기 응용 프로그램

` Point startDragMousePoint; 
    Point startShapeLocation; 
    private void Canvas_MouseMove(object sender, MouseEventArgs e) 
    { 
     if(isMouseDown) 
     { 
      Point deltaPoint = Point.Subtract(e.Location, new Size(startDragMousePoint)); 
      shape.Location = Point.Add(startShapeLocation, new Size(deltaPoint)); 
      Invalidate(); 
     } 
    } 

    private void Canvas_Paint(object sender, PaintEventArgs e) 
    { 
     shape.Render(e.Graphics); 
    }` 
+0

"무효화"방법이란 무엇입니까? Dispatcher 클래스를 사용하여 백그라운드 스레드로 논리를 푸시하고 Dispatcher 속성을 더 낮은 값으로 설정할 수 있습니까? GDI Invalidate()의 –

+0

은 창을 강제로 다시 그립니다. 그것은 마이크로 소프트 라이브러리 기능입니다. – Jbecwar

답변

0

세 가지 일반적인 해결책이 있습니다.

1) 움직이는 동안 그려서는 안되며, 이것은 창문 속의 오랜 시간 동안의 해결책이었습니다. 창을 끌었을 때, 그것은 무시 당했고 당신은 창 개요를 보았습니다.

2) 비트 맵 개체를 만들고 이동하십시오. 그 밑에 영역을 다시 그려야합니다.

3) 변경하려는 영역 만 구멍 창을 무효화하지 마십시오. 버퍼 (비트 맵)에 그리면 영역을 다시 사용할 수 있습니다.

또한 GDI가 세계에서 가장 빠른 드로잉 기능이 아닌 경우에도 마찬가지입니다. 모양이 매우 복잡한 경우 OpenGL, DirectX 또는 SDL을 사용하는 것이 좋습니다.

Rectangle changedArea = new Rectangle(cX, cY, cW, cH); 
this.Invalidate(changedArea); 

은 또한 당신의 통제가에서 DoubleBuffering

this.DoubleBuffered = true; 
0

대신 전체 영역을 무효화 당신은 사용하여 변경된 컨트롤의 일부를 무효화 할 수 제한된 코드를 넣어, 나는 invalidate 어떤 문제가 발생하지 않습니다 생각합니다. 아마도이 문제는 실제 렌더링 코드 인 shape.Render()에서 발생할 수 있습니다. 이전에는 마우스 이동시 Invalidate를 호출 한 응용 프로그램과 비슷한 응용 프로그램을 작성했으며 응용 프로그램이 정상적으로 작동했습니다. 이중 버퍼링이 가능할 때 약간의 깜박임 만있었습니다.

0

을 사용하도록 설정되어 있는지 확인하십시오

관련 문제