У меня есть указатель на буфер COLORREF, что-то вроде: COLORREF* buf = new COLORREF[x*y];
Подпрограмма заполняет этот буфер информацией о цвете.Каждый COLORREF представляет один пиксель.
Теперь я хочу нарисовать этот буфер в контексте устройства. Мой текущий подход работает, но довольно медленный (== ~ 200 мс на рисунок, в зависимости от размера изображения):
for (size_t i = 0; i < pixelpos; ++i)
{
// Get X and Y coordinates from 1-dimensional buffer.
size_t y = i / wnd_size.cx;
size_t x = i % wnd_size.cx;
::SetPixelV(hDC, x, y, buf[i]);
}
Есть ли способ сделать это быстрее;все сразу, не один пиксель за другим?
Я не очень знаком с GDI.Я слышал о многих API, таких как CreateDIBitmap (), BitBlt (), HBITMAP, CImage и обо всем этом, но понятия не имею, как его применить.Кажется, все довольно сложно ...
MFC также приветствуется.
Есть идеи?
Заранее спасибо.
(Справочная информация: упомянутая выше подпрограмма является ядром OpenCL - графический процессор вычисляет изображение Мандельброта и сохраняет его в буфере COLORREF.)
EDIT:
Спасибо всем за ваши предложения.Ответы (и ссылки) дали мне некоторое представление о графическом программировании Windows.Производительность теперь приемлема (работает полу-в реальном времени прокрутка Мандельброта:)
Я получил следующее решение (MFC):
...
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap mandelbrotBmp;
mandelbrotBmp.CreateBitmap(clientRect.Width(), clientRect.Height(), 1, 32, buf);
CBitmap* oldBmp = dcMemory.SelectObject(&mandelbrotBmp);
pDC->BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &dcMemory, 0, 0, SRCCOPY);
dcMemory.SelectObject(oldBmp);
mandelbrotBmp.DeleteObject();
Так что в основном CBitmap :: CreateBitmap () спас меняот использования сырого API (который я до сих пор не до конца понимаю).Пример из документации CDC :: CreateCompatibleDC также был полезен.
Мой Мандельброт теперь синий - с помощью SetPixelV () он был красным.Но я предполагаю, что это как-то связано с CBitmap :: CreateBitmap (), интерпретирующим мой буфер, не очень важно.
Я мог бы попробовать предложение OpenGL, потому что это был бы гораздо более логичный выбор, и я все равно хотел попробовать OpenCL под Linux.