我使用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();
我可以看到视觉工作室的内存使用量逐渐增加。如果我注释掉DrawText部分,则不再增加。难道我做错了什么?如何保持DrawText方法不增加内存使用量?我也测试了一个图像,这是同样的问题。我应该以某种方式释放或删除DrawText?任何帮助将不胜感激。
答案 0 :(得分:3)
消失的图像和字体是泄露的GDI资源的标志,而不是内存。
虽然泄漏内存非常糟糕,但泄漏资源却更糟糕,因为它们非常有限。观察游戏任务管理器中的GDI Objects
列;当计数器达到10,000时 - 你就完成了。
删除保存GDI资源的MFC对象是不够的,您需要先从DC中取消选择它们(无法释放当前选定的对象)。
答案 1 :(得分:-1)
以防万一被选中的对象无法删除, 为什么不严格处理?
bitmapDC.SelectObject(&bitmap);
↓
CBitmap* pbmold = bitmapDC.SelectObject(&bitmap);
(omission)
bitmapDC.SelectObject(pbmold); // addition
bitmap.DeleteObject();
bitmapDC.DeleteDC();
字体也与...相同