winapi — C ++ Win32: ускорение растровых операций

Я ищу, чтобы ускорить программу отображения растрового изображения. Это не ужасно медленно, я просто думаю, что это может быть быстрее. Я запускаю его в среде Win32. Вот код:

void load(LPCWSTR file, int i) {
hBitmap[i] = (HBITMAP)::LoadImage(NULL, file, IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
GetObject(hBitmap[i], sizeof(BITMAP), (LPSTR)&hSize[i]);
}
void newBit(int i, int x, int y, HDC hdc) {

BITMAP Bitmap = hSize[i];
HBITMAP hBit = hBitmap[i];

HDC hDCBits = CreateCompatibleDC(hdc);
SelectObject(hDCBits, hBit);
StretchBlt(hdc, x, y, Bitmap.bmWidth, Bitmap.bmHeight,
hDCBits, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, SRCCOPY);
DeleteDC(hDCBits);
}

Я запускаю функцию «Load» в начале, и я в порядке, сколько времени это займет. Я запускаю функцию newBit всякий раз, когда в программе мне нужно. Я специально использую команду stretchBlt, потому что мне нужна возможность изменения размера. Любое понимание того, что я делаю неправильно и что я могу улучшить, будет оценено.

-1

Решение

Поскольку я подозреваю, что это связано с вашим предыдущим вопросом Вот, Выкладываю следующий ответ.

Если вы хотите создать анимацию в своем окне и хотите ускорить процесс, рассмотрите возможность использования GDI + вместо простого winapi.
С GDI + вы просто помещаете свои методы рисования в WM_PAINT сообщение и обновите вашу сцену с отменой вашего контроля прямоугольника и обновлением окна.
Например что-то вроде этого:

InvalidateRect(hwnd, NULL, TRUE);
UpdateWindow(hwnd);

Обработка сообщений WM_PAINT может выглядеть следующим образом:

case WM_PAINT:
{
/************************************************************************/
/* Initialize                                                           */
/************************************************************************/
hdc = BeginPaint(hwnd, &ps);
Graphics graphics(hdc);
Bitmap *pMemBitmap = new Bitmap(rect.right, rect.bottom);
Graphics* pMemGraphics = Graphics::FromImage(pMemBitmap);
SolidBrush back(Color(0, 0, 0));
pMemGraphics->FillRectangle(&back, 0, 0, rect.right, rect.bottom); // Fill your background with some color
pMemGraphics->SetSmoothingMode(SmoothingModeHighQuality); // Set your raster quality
graphics.SetSmoothingMode(SmoothingModeHighQuality);

// Rotate some primitive around your screen
static double x = M_PI + M_PI / 2;
x += 0.03f;

if(x > M_PI * 2)
{
x = 0;
}
double posX = cos(x);
double posY = sin(x);

Pen pen(Color(255, 255, 255, 0), 5);
pMemGraphics->DrawEllipse(&pen, (int)(posX * 50 - 15 + rect.right / 2), (int)(posY * 50 - 15 + rect.bottom / 2), 30, 30);
graphics.DrawImage(pMemBitmap, 0, 0); // Draw the entire bitmap to screen (double buffering)

/************************************************************************/
/* Cleanup                                                              */
/************************************************************************/
delete pMemGraphics;
delete pMemBitmap;
EndPaint(hwnd, &ps);
break;
}

Чтобы избежать мерцания, вы должны сказать winapi не стирать фон следующим образом:

case WM_ERASEBKGND:
{
return true; // Tell winapi, we already handled that.
}
-2

Другие решения


По вопросам рекламы [email protected]