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秒ほど振った後、コンピューターのRAMの全容量に達するまで、メモリが過剰に使用され始めます(毎秒約200Moが使用されます)...

そのような行動の原因を探したところ、それはもっぱら

BeginDraw();
EndDraw();

部。完了したすべてのペイントを削除し、WM_PAINT 以外のすべてのメッセージの処理を停止しました。それでも...(そして、デバッグもオフにしました)。

次に、他のコード、つまりDirect2D Hello World Exampleを確認しました。ウィンドウのサイズ変更ハンドルを振った。そして、まったく同じメモリの過剰使用を取得します....

そう。何が原因なのかわかりません。Direct2D のバグですか?私のグラフィックカードドライバー?同じ現象を経験した人はいますか?

4

1 に答える 1

0

私はその振る舞いを理解していません。メモリ使用量は増加しますが、最大約 2MB までしか増加せず、その後は増加しなくなります。

あなたの質問には矛盾しているように見える部分があります:

そのような行動の原因を探したところ、それはもっぱら

BeginDraw();

EndDraw();

部。完了したすべてのペイントを削除し、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 に答える