4

何らかの理由で、以下のコードでメモリ不足エラーが発生します。私は何が欠けていますか?

    for(int n = 0; n < 512; ++n)
    {               
        D3D11_TEXTURE2D_DESC texture_desc = {};
        texture_desc.Width                = 1920;
        texture_desc.Height               = 1080;
        texture_desc.MipLevels            = 1;
        texture_desc.ArraySize            = 1;
        texture_desc.Format               = DXGI_FORMAT_R8G8B8A8_UNORM;
        texture_desc.SampleDesc.Count     = 1;
        texture_desc.Usage                = D3D11_USAGE_DEFAULT;
        texture_desc.BindFlags            = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;

        ID3D11Texture2D* target_d3d_ptr;
        HRESULT hr = this->device_ptr->CreateTexture2D(&texture_desc, nullptr, &target_d3d_ptr);
        if(FAILED(hr))
            throw runtime_error(_com_error(hr).ErrorMessage());

        target_d3d_ptr->Release();
    }
4

3 に答える 3

2

1920 * 1080 * 32 ビット = 8294400 バイト 8294400 バイト x 485 テクスチャ = 3.836 GB のメモリ。これは 32 ビット マシンの限界です。32 ビット プログラムと 64 ビット プログラムのどちらをコーディングしているかはわかりませんが、32 ビットの場合、アドレス指定できる最大仮想メモリは 4GB を少し下回り、512 個のテクスチャでこの制限を超えます。Release がこのメモリをすぐに解放しないことを考慮すると、実際に 32 ビットでコーディングしている場合、メモリが不足する理由は明らかです

于 2013-01-27T00:57:48.247 に答える
2

あなたの場合ではないかもしれませんが、たとえば、Microsoft の COM メソッドは(少なくとも私の環境、つまり Visual Studio 2012 で見つけた実装では)CComObject::CreateInstance戻ることができ、私の意見では誤解を招く可能性があります。E_OUTOFMEMORY

COMメソッドは次のようなものです(atlcom.h

ATLPREFAST_SUPPRESS(6387)
template <class Base>
_Success_(return == S_OK) HRESULT WINAPI CComObject<Base>::CreateInstance(
    _Deref_out_ CComObject<Base>** pp) throw()
{
    // code omitted

    HRESULT hRes = E_OUTOFMEMORY;
    CComObject<Base>* p = NULL;
    ATLTRY(p = new CComObject<Base>())
    if (p != NULL)
    {
        // code omitted
    }
    *pp = p;    
    return hRes;
}
ATLPREFAST_UNSUPPRESS()

E_OUTOFMEMORYそして、まだ利用可能なメモリがたくさんある場合でも、上記のコードは戻ることができるように思えます: マクロは呼び出しをtry-catch(...) ブロックでATLTRYラップするだけなので、のコンストラクターが例外をスローして失敗した場合、メモリの問題に関係なくても、あらゆる種類の例外が発生し、関数は を返します。newBasepNULLE_OUTOFMEMORY

于 2014-08-29T15:26:32.857 に答える