这是一个测试调用需要多长时间的测试CreateCompatibleDC
。我发现平均而言,拨打每个电话大约需要 10 到 15 微秒。与 相比,这相对较快BitBlt
,特别是对于较大的图像。因此,持有内存DC并没有太大的优势。
case WM_PAINT:
{
static HBITMAP hbitmap = (HBITMAP)LoadImage(0, L"path.bmp",
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
std::wostringstream oss;
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
auto start = std::chrono::system_clock::now();
auto memdc = CreateCompatibleDC(hdc);
oss << L"CreateCompatibleDC: "
<< (std::chrono::system_clock::now() - start).count() / 10 << "\n";
auto oldbitmap = SelectObject(memdc, hbitmap);
start = std::chrono::system_clock::now();
BitBlt(hdc, 0, 0, ps.rcPaint.right, ps.rcPaint.bottom, memdc, 0, 0, SRCCOPY);
oss << L"BitBlt: "
<< (std::chrono::system_clock::now() - start).count() / 10 << "\n";
SelectObject(memdc, oldbitmap);
DeleteDC(memdc);
EndPaint(hwnd, &ps);
OutputDebugString(oss.str().c_str());
break;
}
在 Windows 10 上的结果:
24bit 5MB 位图的结果:
CreateCompatibleDC
: 17 微秒
BitBlt
: 2500 微秒
8bit 275kb 的结果:
CreateCompatibleDC
: 12 微秒
BitBlt
: 500 微秒