Оптимизация рисования GDI +? - PullRequest
0 голосов
/ 01 мая 2010

Я использую 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;

Мне интересно, правильно ли я это делаю или есть области, убивающие процессор.Потому что сейчас для рендеринга требуется ~ 1сек, и я хочу иметь возможность очень быстро его перерисовать.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1008* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *.

Ответы [ 2 ]

0 голосов
/ 15 мая 2010

Вместо того, чтобы создавать все ресурсы и разбирать их все для каждого WM_PAINT, вы можете попробовать разгрузить его для настройки и очистки приложения. Другими словами, переместите все вещи, такие как CreateCompatibleDC, CreateCompatibleBitmap, в WM_CREATE, а соответствующие удаления в WM_DESTROY. Вы можете хранить ссылки на все контексты устройства, маркеры кисти и тому подобное в качестве атрибутов класса или статических переменных. Таким образом, когда наступает время WM_PAINT, все настройки уже выполнены, и вам нужно только обработать фактический чертеж.

0 голосов
/ 01 мая 2010

Самая медленная строка в вашем коде на данный момент, вероятно, BitBlt(hdc,0,0,900,900,MemDC,0,0,SRCCOPY);. Функции Blit обычно очень медленные и сильно загружают процессор. Использование графического процессора было бы быстрее, но гораздо более сложным (если даже возможно связать GDI +) Попытайтесь найти способ рисования на поверхности, которую вы будете использовать в конце, без копирования попиксельно.

...