2010-05-01 5 views
0

Я использую C++ и GDI + Я собираюсь сделать приложение для векторного рисования и хочу использовать GDI + для рисования.Оптимизация GDI + рисунка?

I'v создал простой тест, чтобы ознакомиться с ним:

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 сек, и я хочу, чтобы он быстро перерисовывал себя. Thanks

В реальной ситуации было бы лучше просто разобрать часть экрана для перерисовки и только перерисовать элементы с границами этого?

+0

Я задал соответствующий вопрос некоторое время назад. Возможно, это может дать вам несколько указателей: http://stackoverflow.com/questions/957573/winforms-how-to-speed-up-invalidate – Pedery

ответ

0

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

+0

на втором экзамене, похоже, вы рисуете много полугоризонтальных полигонов. win32 gdi на самом деле не является графической системой производительности. это нормально с базовыми прямоугольными элементами, но когда вы начинаете задавать произвольные полигоны, это будет медленнее. будь то я считаю, что directx или opengl для чего-то более сложного, чем настоящий базовый материал. – JustJeff

0

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

+0

Нет, похоже, это g-> FillPolygon (& b, pts, 4); (раз 250). Если я уменьшу до 30 итераций, это будет быстро, но мне нужно больше 30 форм: -p – jmasterx

+0

Используйте переменную для цикла, не всегда рисуйте 250 фигур, нарисуйте столько, сколько вам нужно. Когда вы нарисуете больше, будет некоторое замедление, это естественно. Старайтесь не рисовать одинаковые фигуры дважды (если у вас нет прозрачности, чтобы беспокоиться). – ssube

+0

Что мне делать, когда нужно перерисовать все окно (т. Е. Все ...)? – jmasterx

Смежные вопросы