2010-05-01 73 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領域。因爲現在需要〜1秒來渲染,我希望能夠很快地重繪它。 謝謝

在真實的情況下,只有找出屏幕上的部分才能重繪並且只重繪帶有這個邊界的元素才更好?

+0

前一段時間我問了一個相關的問題。也許這可以給你幾個指針:http://stackoverflow.com/questions/957573/winforms-how-to-speed-up-invalidate – Pedery 2010-05-15 05:09:04

回答

0

不是每個WM_PAINT都創建所有資源並將其全部拆除,您可以嘗試將其卸載到應用程序設置和清理中。換句話說,將所有的東西像CreateCompatibleDC,CreateCompatibleBitmap轉換爲WM_CREATE,並將相應的刪除轉移到WM_DESTROY。您可以將所有設備上下文,畫筆句柄等的引用保留爲類屬性或靜態變量。這樣,當它是WM_PAINT時間時,所有設置已經完成,並且您只需處理實際繪圖。

+0

第二次檢查,它看起來像你正在繪製大量的半隨機形狀的多邊形。 win32 gdi並不是一個真正的性能圖形系統。它可以與基本的矩形東西確定,但是當你開始詢問任意多邊形時,它肯定會變慢。是我,我會考慮directx或opengl的任何比真正的基本東西更復雜的東西。 – JustJeff 2010-05-15 05:25:33

0

此時代碼中最慢的一行可能是BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY);。 Blit功能通常在CPU上非常緩慢和困難。使用GPU會更快,但涉及更多(如果甚至可能綁定到GDI +)。嘗試找到一種方法來繪製到最終將使用的表面,而不是逐個像素地進行復制。

+0

不,它似乎是g-> FillPolygon(&b,pts,4); (250次)如果我減少到30次迭代它的快速閃爍,但是我需要30次以上的形狀:-p – jmasterx 2010-05-01 17:47:03

+0

使用循環變量,並不總是繪製250個形狀,繪製儘可能多的圖形。當你畫更多的時候會有一些放緩,這很自然。儘量避免畫兩次相同的形狀(除非你有透明度擔心)。 – ssube 2010-05-01 17:54:19

+0

當我們需要重新繪製整個窗口(即:所有內容......)時,我該怎麼做? – jmasterx 2010-05-01 18:04:00