2010-05-01 91 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