【发布时间】:2012-06-06 02:46:14
【问题描述】:
我的 GDI 程序在 Windows XP 上运行良好,但在 Windows Vista 和 7 上,由于缺少 GDI 硬件加速,它看起来很糟糕。我记得几年前读过一篇文章,说 Windows 7 为一些 GDI 函数添加了硬件加速,包括 BitBlt() 函数。据推测,如果您绘制到内存位图,然后使用 BitBlt() 将图像复制到您的主窗口,它的运行速度与 XP 大致相同。这是真的吗?
如果是真的,你是怎么做到的?我在编程方面很糟糕,并且遇到了一些麻烦。我创建了下面的类来尝试让它工作:
class CMemBmpTest
{
private:
CDC m_dcDeviceContext;
CBitmap m_bmpDrawSurface;
public:
CMemBmpTest();
~CMemBmpTest();
void Init();
void Draw();
};
CMemBmpTest::CMemBmpTest()
{
}
CMemBmpTest::~CMemBmpTest()
{
m_bmpDrawSurface.DeleteObject();
m_dcDeviceContext.DeleteDC();
}
void CMemBmpTest::Init()
{
m_dcDeviceContext.CreateCompatibleDC(NULL);
m_bmpDrawSurface.CreateCompatibleBitmap(&m_dcDeviceContext, 100, 100);
}
void CMemBmpTest::Draw()
{
m_dcDeviceContext.SelectObject(I.m_brshRedBrush);
m_dcDeviceContext.PatBlt(0, 0, 100, 100, BLACKNESS);
}
在窗口的 OnPaint() 函数中我添加了一行:
pDC->BitBlt(2, 2, 100, 100, &m_MemBmp, 0, 0, SRCCOPY);
我希望在窗口的角落看到一个 100x100 的黑框,但它没有用。我可能做的一切都非常错误,所以如果有人能建议我如何正确地做到这一点,我将不胜感激。
感谢您提供的任何建议。
【问题讨论】:
-
如果您使用 GDI,您不太可能从硬件加速中受益。至少在任何合理的范围内。更值得做的是检查您的代码并清理它以消除各种过度处理。您还可以尝试禁用 Aero 以可能回滚到“经典”GDI(而不是在 Direct3D 之上实现)。
-
如果您只想做双缓冲(我不能完全理解您的问题,但我认为这就是您想要的),那么您最好使用 CMemDC,它是只需将 2 或 3 行代码添加到您的 OnPaint() 方法中,瞧,一切顺利。 (当然,如果您对每个像素使用 SetPixelV(),您的渲染仍然会很慢......)