我最近开始使用Direct2D,在调整窗口大小时发现了一些奇怪的行为:内存使用飙升,最后我得到一些“内存不足错误”。这是我的代码的布局:
// Nothing special in there
int wWinMain(...)
{
// Window creation, ressource allocation, message loop.
}
然后是windowProc
// Nothing special in there either
case WM_PAINT :
if(myObject->paint()) {
ValidateRect(myObject->rect());
return 0;
}
else return DefWindowProc(...);
default :
return DefWindowProc(...);
对于绘画方法我只使用
// Check the ressources
checkRessources();
mRenderTarget->BeginDraw();
mRenderTarget->EndDraw();
// Check for errors
checkForError();
除此之外别无其他。一切都很好,窗户被移动了。然后我拿着调整大小的手柄,然后开始摇动它,这会导致我的窗口不断调整大小并重新绘制。在震动了大约20秒之后,内存开始过度使用(每秒使用大约200Mo)直到它达到我的计算机RAM的全部容量...
我寻找这种行为的起源,并发现它仅由
引起BeginDraw();
EndDraw();
一部分。我删除了所有完成的绘画,停止处理除WM_PAINT之外的所有消息。还是......(我也开始调试了。)
然后我检查了一些其他代码,即Direct2D Hello World Example。摇动窗口调整大小手柄。并获得完全相同的内存过度使用....
因此。我不知道是什么原因引起的。这是一个Direct2D错误吗?我的显卡驱动程序?有人遇到过同样的现象吗?
答案 0 :(得分:0)
我没有那种行为。内存使用确实增加但只有2mb左右,然后停止增加。
关于你的问题,有一部分似乎是矛盾的:
我寻找这种行为的起源,并发现它仅由
引起BeginDraw();
EndDraw();
一部分。我删除了所有完成的绘画,停止处理除WM_PAINT之外的所有消息。还是......(我也开始调试了。)
所以它是由BeginDraw / EndDraw调用引起的,但是你删除了它们并且问题仍然存在?
编辑:要查看_com_error异常的描述,请将所有代码包装在try / catch块中的wWinMain中,如下所示:
int __stdcall wWinMain(HINSTANCE, HINSTANCE, PWSTR, int)
{
try
{
...
}
catch (const _com_error& e)
{ // <-- Put a breakpoint at this line and then inspect the "e" variable in the Locals window in the debugger
// Or use this:
::MessageBoxW(nullptr, e.ErrorMessage(), L"Error", MB_ICONSTOP);
}
}