時々、私のアプリはDirectXのものを初期化してシーンを読み込みますが、大規模なテクスチャ(テクスチャごとに最大200〜300MB)を含むことがあります。最初に、すべてが正常に動作しますが、しばらくFromMemory()
後だけで作業が、唯一の大きなテクスチャに停止します。もちろんSlimDXはしばらくして大きなテクスチャの読み込みを停止します
SlimDX.Direct3D11.Direct3D11Exception: E_FAIL: An undetermined error occurred (-2147467259)
at SlimDX.Result.Throw[T](Object dataKey, Object dataValue)
at SlimDX.Result.Record[T](Int32 hr, Boolean failed, Object dataKey, Object dataValue)
at SlimDX.Direct3D11.ShaderResourceView.ConstructFromMemory(Device device, Byte[] memory, D3DX11_IMAGE_LOAD_INFO* loadInformation)
at SlimDX.Direct3D11.ShaderResourceView.FromMemory(Device device, Byte[] memory)
、私はすべての処分は、以前に新しいシーンをロードする前にロードされたShaderResourceView
Sをロードしました。しかし、FromMemory()
は、アプリの再起動後にのみ再び動作を開始します。他に何が間違っているかも教えてください。
UPD:
System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
at D3DX11CreateTextureFromMemory(ID3D11Device* , Void* , UInt32 , D3DX11_IMAGE_LOAD_INFO* , ID3DX11ThreadPump* , ID3D11Resource** , Int32*)
at SlimDX.Direct3D11.Resource.ConstructFromMemory(Device device, Byte[] memory, D3DX11_IMAGE_LOAD_INFO* info)
at SlimDX.Direct3D11.Texture2D.FromMemory(Device device, Byte[] memory)
そして有効にネイティブコードのデバッグで:
Exception thrown at 0x748AA882 in app.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x00AFC7C8.
Exception thrown: 'System.Runtime.InteropServices.SEHException' in SlimDX.dll
悲しいことに、私はD3DX11CreateTextureFromMemory()
が実際にどのように動作するか見当がつかないTexture2D.FromMemory()
で
、私はこれを取得しますなぜメモリを再割り当てしようとしますか?多分x64に移行する時間です...
32ビット(x86)または64ビットのネイティブを使用していますか?ビデオメモリを断片化したり、メモリ不足の状態になったり、異常な場所でエラーを受け取ったりする可能性があります(したがって '' E_FAIL'')。デバッグデバイスからの出力を探してみてください。 –
@ChuckWalbourn 32ビットですが、通常は約200 MB以上のRAMを必要としません(シーンをロードするときは別として、通常は360°のパノラマ用に200 MBの巨大なテクスチャが1つしかありません)。悲しいことに、私はデバッグで有益なものは何も見つかりません。 'EnableObjectTracking'と' DetectDoubleDispose'の両方が有効になり、すべてが適切に配置されているように見えます。 –
あなたのデバイスのmax_textureのサイズをチェックしてください。それは192MB以上のテクスチャをロードしません。 – Nain