调整窗口大小时Direct2D内存过度使用

时间:2013-03-04 22:52:38

标签: c++ memory resize direct2d

我最近开始使用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错误吗?我的显卡驱动程序?有人遇到过同样的现象吗?

1 个答案:

答案 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);
    }
}