0

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

4

1 回答 1

0

我不明白这种行为。内存使用确实增加了,但最多只有 2mb 左右,然后就停止增加了。

关于您的问题,有一部分似乎很矛盾:

我寻找这种行为的根源,发现这完全是由

开始绘制();

结束绘制();

部分。我删除了所有完成的绘画,停止处理除 WM_PAINT 之外的所有消息。仍然......(我也转向调试)。

所以它是由 BeginDraw/EndDraw 调用引起的,但是你删除它们并且问题仍然存在?

编辑:要查看 _com_error 异常的描述,请将 wWinMain 中的所有代码包装在 try/catch 块中,如下所示:

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);
    }
}
于 2013-03-04T23:14:38.343 回答