BitBlt
或AlphaBlend
的调用会使用硬件加速(如果可用)。它还提到窗口的内容仅保留在视频内存中。现在,这对于窗口DC来说非常好和正确,但是我如何使用驻留在视频卡内存中的内存DC?一旦我们完成了这个过程,如何直接访问像素,我认为这将涉及以下三个步骤:1.将数据暂时复制到系统内存中2.更改像素数据3.复制回视频内存。
我尝试了两种方法,都分配了系统内存,可以在任务管理器中看到...
CreateCompatibleBitmap
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); m_hBmp = CreateCompatibleBitmap(hDC, cx, cy); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
and then call to obtain the bits
GetBitmapBits(...)
according to various comments this should indeed create the compatible bitmap in video memory, but why can I still see an increase in system memory (even when I don't call
GetBitmapBits
)?CreateDIBSection
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = cx; bmi.bmiHeader.biHeight = -cy; // top-down bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; m_hBmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&m_pBits, NULL, NULL); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
in this case we receive the pointer to the bits immediately (
m_pBits
) so it's obvious that these reside in system memory...
BitBlt
仍然需要再次检查/复制系统内存... 在我看来并不是很优化。
编辑:我还尝试使用BeginBufferedPaint
和GetBufferedPaintBits
创建内存DC。它也分配系统内存,因此在这方面,我想它只是上述方法的包装器,但缓存DC,因此下一次调用不一定必须重新创建内存DC。请参见雷蒙德·陈的article。
编辑#2:我想实际问题是:我是否正确地在方法1或2中创建内存DC以获得硬件加速的GDI操作?对我来说,它们都似乎很快,而且两种方法提供的速度也相同,所以没有真正的方法来检查它...