优化GDI +绘图?

时间:2010-05-01 16:57:44

标签: c++ optimization gdi+

我正在使用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秒,我希望能够让它快速重绘。 感谢

在实际情况下,最好只是弄清楚要重绘的屏幕部分,只重绘具有此范围的元素?

2 个答案:

答案 0 :(得分:0)

目前代码中最慢的行可能是BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY);。 Blit函数通常在CPU上非常慢且很难。使用GPU会更快,但涉及的更多(如果甚至可能与GDI +联系起来)。尝试找到一种绘制到最终将使用的曲面的方法,而不是逐像素地复制。

答案 1 :(得分:0)

您可以尝试将其卸载到应用程序设置和清理,而不是为每个WM_PAINT创建所有资源并将其全部拆除。换句话说,将所有东西(如CreateCompatibleDC,CreateCompatibleBitmap)转换为WM_CREATE,并将相应的删除转移到WM_DESTROY。您可以将对所有设备上下文,画笔句柄等的引用保留为类属性或静态变量。这样,当它是WM_PAINT时,所有的设置都已经完成,你只需要处理实际的绘图。