我正在使用C++和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秒的时间来渲染,我希望能够让它快速地重新绘制。谢谢
在真实的情况下,找出要重画的屏幕部分,然后只重画有此界限的元素,会不会更好?
发布于 2010-05-15 13:20:39
您可以尝试将其卸载到应用程序设置和清理过程中,而不是创建所有资源并为每个WM_PAINT拆卸它们。换句话说,将CreateCompatibleDC、CreateCompatibleBitmap等所有内容转移到WM_CREATE,并将相应的deletes转移到WM_DESTROY。您可以将对所有设备上下文、笔刷句柄等的引用保留为类属性或静态变量。这样,到了WM_PAINT的时候,所有的设置都已经完成了,您只需要处理实际的绘图。
发布于 2010-05-02 01:33:20
目前代码中最慢的一行可能是BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY);。Blit函数在CPU上通常是非常慢和困难的。使用图形处理器会更快,但涉及更多(如果它甚至可以与GDI+捆绑在一起)。尝试找到一种方法来绘制到你最终将使用的表面,而不是逐个像素地复制。
https://stackoverflow.com/questions/2750778
复制相似问题