Я ищу ускорение программы отображения растровых изображений. Это не ужасно медленно, я просто думаю, что это может быть быстрее. Я запускаю его в среде Win32. Вот код:C++ 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);
}
Я запускаю функцию «Загрузить» в начале, и мне хорошо, сколько времени потребуется. Я запускаю функцию newBit всякий раз, когда в программе, которая мне нужна. Я специально использую команду stretchBlt, потому что мне нужна возможность изменения размера. Любое понимание того, что я делаю неправильно, и то, что я могу улучшить, будет оценено по достоинству.
Вам нужно сохранить результат 'SelectObject (hDCBits, hBit);' на HBITMAP, а затем вернуть его обратно в hDCBits до удаления HDC. Несоблюдение этого требования приведет к утечке ресурсов. Ручки GDI - это ограниченный ресурс. Кроме того, поскольку вы кэшируете загруженные изображения, вы должны добавить еще одну переменную, чтобы вы только однажды создали и уничтожали HDC. Вы можете получить исходное растровое изображение, которое выбрано в нем, с вызовом 'GetCurrentObject (hDCBits, OBJ_BITMAP);', чтобы (a) вам нужно было только сохранить его копию и (b) вы можете восстановить это растровое изображение до окончательного уничтожения HDC. – enhzflep