繁体   English   中英

Win32 C ++中的DrawText会增加内存使用量

[英]Memory usage increases with DrawText in Win32 C++

我已经使用MFC实现了一个简单的游戏。 它包含图像和格式化的文本。 在测试过程中,我发现程序运行大约7分钟后没有问题,之后图像消失并且文本格式重置。 为了确定问题,我重写了一个非常基本的版本,仅显示格式化的文本。 但是问题仍然存在,我已经搜索了一天,但问题仍然相同。 这是我的OnPaint方法

    CPaintDC dc(this);

    CRect clientRect;
    GetClientRect(&clientRect);

    CDC bitmapDC;
    bitmapDC.CreateCompatibleDC(&dc);

    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, clientRect.Width(), clientRect.Height());
    bitmapDC.SelectObject(&bitmap);

    CBrush backgroundBrush;
    backgroundBrush.CreateSolidBrush(RGB(0xf8, 0xf8, 0xf8));
    bitmapDC.FillRect(&clientRect, &backgroundBrush);

    int SavedDc = bitmapDC.SaveDC();

    long nHeight = -MulDiv(20, GetDeviceCaps(bitmapDC, LOGPIXELSY), 72);
    HFONT myfont = CreateFont(nHeight, 0, 0, 0, FW_ULTRALIGHT, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
        CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Arial"));

    bitmapDC.SelectObject(myfont);
    SetBkMode(bitmapDC, TRANSPARENT);

    bitmapDC.DrawText(L"This shouldn't happen", &clientRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    dc.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &bitmapDC, 0, 0, SRCCOPY);

    bitmapDC.RestoreDC(SavedDc);
    backgroundBrush.DeleteObject();
    bitmap.DeleteObject();
    bitmapDC.DeleteDC();

我可以看到Visual Studio中的内存使用量逐渐增加。 如果我注释掉DrawText部分,则不会再增加。 难道我做错了什么? 如何防止DrawText方法增加内存使用量? 我也用图像测试过,这是同样的问题。 我应该以某种方式释放或删除DrawText吗? 任何帮助将非常感激。

消失的图像和字体是GDI资源泄漏的迹象,而不是内存泄漏。

尽管泄漏内存是很糟糕的,但泄漏资源则更糟,因为它们非常有限。 观察游戏任务管理器中的“ GDI Objects列; 当计数器达到10,000时-您就完成了。

删除拥有GDI资源的MFC对象是不够的,您需要首先从DC中取消选择它们(无法释放当前选择的对象)。

万一进入DC的对象无法删除,为什么不严格处理呢?

bitmapDC.SelectObject(&bitmap);
 ↓
CBitmap* pbmold = bitmapDC.SelectObject(&bitmap);

(omission)

bitmapDC.SelectObject(pbmold); // addition
bitmap.DeleteObject();
bitmapDC.DeleteDC();

字体也一样...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM