2010-05-01 4 views
0

저는 C++과 GDI +를 사용하고 있습니다. 저는 벡터 드로잉 어플리케이션을 만들고있을 것이고 드로잉에 GDI +를 사용하고 싶습니다. 내가 제대로하고 있어요 만약 내가 궁금하네요GDI + 드로잉을 최적화 하시겠습니까?

case WM_PAINT: 
     GetCursorPos(&mouse); 
     GetClientRect(hWnd,&rct); 

     hdc = BeginPaint(hWnd, &ps); 
     MemDC = CreateCompatibleDC(hdc); 
     bmp = CreateCompatibleBitmap(hdc, 600, 600); 
     SelectObject(MemDC,bmp); 
     g = new Graphics(MemDC); 

     for(int i = 0; i < 1; ++i) 
     { 
      SolidBrush sb(Color(255,255,255)); 
      g->FillRectangle(&sb,rct.top,rct.left,rct.right,rct.bottom); 
     } 

     for(int i = 0; i < 250; ++i) 
     { 
      pts[0].X = 0; 
      pts[0].Y = 0; 

      pts[1].X = 10 + mouse.x * i; 
      pts[1].Y = 0 + mouse.y * i; 

      pts[2].X = 10 * i + mouse.x; 
      pts[2].Y = 10 + mouse.y * i; 

      pts[3].X = 0 + mouse.x; 
      pts[3].Y = (rand() % 600) + mouse.y; 

      Point p1, p2; 
      p1.X = 0; 
      p1.Y = 0; 
      p2.X = 300; 
      p2.Y = 300; 

      g->FillPolygon(&b,pts,4); 
     } 


     BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY); 

     EndPaint(hWnd, &ps); 

     DeleteObject(bmp); 
     g->ReleaseHDC(MemDC); 
     DeleteDC(MemDC); 
     delete g; 
     break; 

, 아니면 제가 CPU를 죽이는 영역이있는 경우 :

은 I'v은 잘 알고 얻을 수있는 간단한 테스트를 만들었습니다. 지금 당장 이걸 렌더링하는 데 1 초 ~ 1 초가 걸리므로 아주 빨리 다시 그려 낼 수 있기를 원합니다. 감사합니다.

실제 상황에서는 화면의 일부를 다시 그리는 것으로 파악하고이 범위 내에서 요소 만 다시 그리는 것이 좋습니다.

+0

나는 얼마 전 관련 질문을했다. 어쩌면이 몇 가지 포인터를 줄 수 있습니다. http://stackoverflow.com/questions/957573/winforms-how-to-speed-up-invalidate – Pedery

답변

0

모든 리소스를 만들고 모든 WM_PAINT에 대해 모든 리소스를 다운시키는 대신 응용 프로그램 설치 및 정리 작업을 수행 할 수 있습니다. 즉, CreateCompatibleDC, CreateCompatibleBitmap과 같은 모든 항목을 WM_CREATE로 이동하고 해당 삭제를 WM_DESTROY로 이동합니다. 모든 장치 컨텍스트, 브러시 핸들 등에 대한 참조를 클래스 속성 또는 정적 변수로 유지할 수 있습니다. WM_PAINT 시간이되면 모든 설정이 이미 완료되어 실제 그리기 만 처리하면됩니다.

+0

을 사용하면 세미 무작위 모양의 다각형을 많이 그리는 것처럼 보입니다. win32 gdi는 실제로 성능 그래픽 시스템이 아닙니다. 기본 직사각형의 물건은 괜찮지 만, 임의의 다각형을 묻기 시작하면 확실히 느려질 것입니다. 그것은 내가 진짜 기본 물건보다 더 복잡한 아무것도 DirectX 또는 OpenGL을 고려해 줬어. – JustJeff

0

코드에서 가장 느린 줄은 아마도 BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY);입니다. 블리트 기능은 일반적으로 CPU에서 매우 느리고 어렵습니다. GPU를 사용하는 것이 더 빠르지 만 훨씬 더 복잡합니다 (GDI +를 연결할 수도있는 경우). 픽셀 단위로 복사하지 않고 마지막에 사용할 표면에 그릴 방법을 찾으십시오.

+0

g-> FillPolygon (& b, pts, 4); (times 250) 만약 30 회 반복을 줄이면 lightening이 빨라집니다. 그러나 ill는 30 개 이상의 shape가 필요합니다 :-p – jmasterx

+0

루프에 변수를 사용하고, 항상 250 개의 도형을 그리지 않고 필요한만큼을 그립니다. 더 많이 그릴 때 약간의 경기 둔화가있을 것입니다. 동일한 도형을 두 번 그리지 않도록하십시오 (투명도가있는 경우를 제외하고). – ssube

+0

전체 창을 다시 그릴 필요가있을 때 어떻게해야합니까? 두 번째 검사에서 – jmasterx

관련 문제