0

次のものをシェーダーにロードします。

ID3DXBuffer* errors = 0;
ID3DXEffect* effect = 0;

HR(D3DXCreateEffectFromFile(
    gd3dDevice,  L"Shader.fx", 0, 0,
    D3DXSHADER_DEBUG|D3DXSHADER_SKIPOPTIMIZATION,
    0, &effect, &errors));

for (int i = 0; i < 3; i++)  {
    if(errors) {
        errors->Release();
        if (effect)
            effect->Release();

        errors = 0;
        HR(D3DXCreateEffectFromFile(gd3dDevice, L"Shader.fx", 
            0, 0, D3DXSHADER_DEBUG, 0, effect, &errors));
    }
    else
        break;
}

シェーダーをロードしようとしていて、エラー/警告が発生した場合は、あきらめる前にさらに 3 回再試行します。

アプリケーションを閉じると、D3DX から次のメッセージが表示されることがわかりました。

D3DX: メモリ リークが検出されました: 2 つの割り当てが解放されていません (486 バイト)

これは、エラーが発生した場合 (つまり、ループに入った場合) にのみ発生します。なぜこれが起こっているのか本当にわかりません。何かアイデアはありますか?

OK、私はそれを修正しました。単なる論理的な問題でした。「エラー」には3回目の試行で「リリース」が呼び出されなかったため、問題が発生しました。

4

2 に答える 2

2

注: DX 関数 (例: D3DXCreateEffectFromFile) が失敗しなかった場合でも、ID3DXBuffer を解放する必要があります。

于 2010-01-04T18:36:20.893 に答える
0

OK、私はそれを修正しました。単なる論理的な問題でした。「エラー」には3回目の試行で「リリース」が呼び出されなかったため、問題が発生しました。

于 2009-11-28T09:02:26.300 に答える