Каждый пример кода, который я видел, - это GetDC и releaseDC снова и снова. (или BeginPaint/EndPaint) Но я думаю, что рисование экрана происходит очень часто (особенно в игре), хранить их в памяти лучше, чем получать и отпускать все время.Win32API) Зачем мне снова и снова получать GetDC и ReleaseDC?
Так что я действительно хотел бы сохранить mainDC как глобальный и просто использовать его, только отпустите его, когда программа закончится. Но почему люди этого не делают? (возможно, затраты на прием/выпуск DC очень малы?)
case WM_CREATE:
hdc = GetDC(hWnd); //hdc is declared as global HDC
MyBitmap = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
return 0;
case WM_PAINT:
MemDC = CreateCompatibleDC(hdc);
OldBitmap = (HBITMAP)SelectObject(MemDC, MyBitmap);
BitBlt(hdc, 0, 0, 300, 300, MemDC, 0, 0, SRCCOPY);
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
return 0;
* «Но почему люди этого не делают?» * - Потому что это все неправильно , Таким образом, вы сохранили дешевую операцию «GetDC» только для того, чтобы назвать дорогостоящую на каждом перерисовке («CreateCompatibleDC»). И так как вы никогда не называете 'BeginPaint' /' EndPaint', недопустимая область никогда не проверяется, вызывая непрерывные сообщения 'WM_PAINT', даже если нет ничего, чтобы рисовать. Вам нужно научиться тому, как это работает, прежде чем пытаться оптимизировать. – IInspectable
Люди не делают этого так, потому что в документации говорится, что вы не можете. DC не следует кэшировать, как это, если вы не проявляете особой осторожности, чтобы создать свой класс окна с соответствующими флагами, которые вы не должны делать. DC должны быть временными объектами, создаваемыми только тогда, когда это необходимо, и располагаются сразу же после этого. Получение DC с 'GetDC' достаточно дешево, что это хорошо отразилось на 286 процессорах. Это гарантировано *, чтобы быть достаточно быстрым на любом кремнии, который вы используете сейчас. –
@CodyGray Ничего себе, мое любопытство просто сдулось! Спасибо всем за ответ. – JokyDandy