首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CreateCompatibleBitmap和CreateDIBSection (存储器DC)

CreateCompatibleBitmap和CreateDIBSection (存储器DC)
EN

Stack Overflow用户
提问于 2011-09-21 15:37:23
回答 1查看 24.1K关注 0票数 9

据我所读到的这里,似乎大多数Windows函数都是加速的。因此,例如,对BitBltAlphaBlend的调用如果可用,将使用硬件加速。它还提到,窗口的内容只保存在视频内存中。对于窗口DC来说,这一切都是正确的,但是如何使用驻留在显卡内存中的内存DC呢?一旦我们完成了如何获得对像素的直接访问,我认为这将涉及: 1.将数据临时复制到系统内存;2.更改像素数据;3.复制回视频内存。

我尝试过两种方法,这两种方法都分配了系统内存,正如我在任务管理器中所看到的.

  1. CreateCompatibleBitmap HDC hDC =GetDC(空);m_hDC = CreateCompatibleDC(hDC);m_hBmp = CreateCompatibleBitmap(hDC,cx,cy);ReleaseDC(NULL,hDC);m_hOldBmp = (HBITMAP)SelectObject(m_hDC,m_hBmp); 然后调用以获取比特。 GetBitmapBits(.) 根据各种评论,这确实应该在视频内存中创建兼容的位图,但是为什么我仍然可以看到系统内存的增加(即使我不调用GetBitmapBits)?
  2. CreateDIBSection HDC hDC = GetDC(NULL);m_hDC = CreateCompatibleDC(hDC);BITMAPINFO;memset(&bmi,0,sizeof(BITMAPINFO));bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bmi.bmiHeader.biWidth = cx;bmi.bmiHeader.biHeight = -cy;//自顶向下的bmi.bmiHeader.biPlanes = 1;bmi.bmiHeader.biBitCount = 32;bmi.bmiHeader.biCompression = BI_RGB;m_hBmp = CreateDIBSection(hDC,&,DIB_RGB_COLORS *)hDC,NULL,NULL;ReleaseDC(NULL,hDC);m_hOldBmp = (HBITMAP)SelectObject(m_hDC,m_hBmp); 在本例中,我们立即接收到指向位的指针(m_pBits),因此很明显它们驻留在系统内存中.

还是两种方法都保存在系统内存中的副本?但是,如果我更改系统内存中的位,对BitBlt的调用仍然需要从系统内存中再次检查/复制.不是很优化的IMHO。

编辑:我还尝试使用BeginBufferedPaintGetBufferedPaintBits创建内存DC。它还分配系统内存,因此在这方面,我认为它只是上述方法的包装器,但是缓存DC的,因此下一个调用不一定要重新创建内存DC。见雷蒙德·陈的文章

编辑2:我想实际的问题是:在方法1或方法2中,我是否做了正确的内存DC创建来获得硬件加速的GDI操作?对我来说,这一切看起来都很快,而且两种方法都提供了相同的速度,所以没有真正的方法来检查它.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-09-21 21:42:59

内存DC不是在设备上创建的。它们被设计成将GDI输出放入内存中。

来自MSDN上的内存设备上下文

为了使应用程序能够将输出放在内存中,而不是将其发送到实际设备中,请使用特殊的设备上下文进行名为内存设备上下文的位图操作。存储器DC使系统能够将存储器的一部分视为虚拟设备。

如果您想要硬件加速的2d图形,您应该考虑使用Direct2D

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7502588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档