据我所读到的这里,似乎大多数Windows函数都是加速的。因此,例如,对BitBlt或AlphaBlend的调用如果可用,将使用硬件加速。它还提到,窗口的内容只保存在视频内存中。对于窗口DC来说,这一切都是正确的,但是如何使用驻留在显卡内存中的内存DC呢?一旦我们完成了如何获得对像素的直接访问,我认为这将涉及: 1.将数据临时复制到系统内存;2.更改像素数据;3.复制回视频内存。
我尝试过两种方法,这两种方法都分配了系统内存,正如我在任务管理器中所看到的.
GetBitmapBits)?m_pBits),因此很明显它们驻留在系统内存中.还是两种方法都保存在系统内存中的副本?但是,如果我更改系统内存中的位,对BitBlt的调用仍然需要从系统内存中再次检查/复制.不是很优化的IMHO。
编辑:我还尝试使用BeginBufferedPaint和GetBufferedPaintBits创建内存DC。它还分配系统内存,因此在这方面,我认为它只是上述方法的包装器,但是缓存DC的,因此下一个调用不一定要重新创建内存DC。见雷蒙德·陈的文章。
编辑2:我想实际的问题是:在方法1或方法2中,我是否做了正确的内存DC创建来获得硬件加速的GDI操作?对我来说,这一切看起来都很快,而且两种方法都提供了相同的速度,所以没有真正的方法来检查它.
发布于 2011-09-21 21:42:59
内存DC不是在设备上创建的。它们被设计成将GDI输出放入内存中。
来自MSDN上的内存设备上下文:
为了使应用程序能够将输出放在内存中,而不是将其发送到实际设备中,请使用特殊的设备上下文进行名为内存设备上下文的位图操作。存储器DC使系统能够将存储器的一部分视为虚拟设备。
如果您想要硬件加速的2d图形,您应该考虑使用Direct2D。
https://stackoverflow.com/questions/7502588
复制相似问题