2017-03-20 28 views
4

時々、私のアプリは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に移行する時間です...

+0

32ビット(x86)または64ビットのネイティブを使用していますか?ビデオメモリを断片化したり、メモリ不足の状態になったり、異常な場所でエラーを受け取ったりする可能性があります(したがって '' E_FAIL'')。デバッグデバイスからの出力を探してみてください。 –

+0

@ChuckWalbourn 32ビットですが、通常は約200 MB以上のRAMを必要としません(シーンをロードするときは別として、通常は360°のパノラマ用に200 MBの巨大なテクスチャが1つしかありません)。悲しいことに、私はデバッグで有益なものは何も見つかりません。 'EnableObjectTracking'と' DetectDoubleDispose'の両方が有効になり、すべてが適切に配置されているように見えます。 –

+0

あなたのデバイスのmax_textureのサイズをチェックしてください。それは192MB以上のテクスチャをロードしません。 – Nain

答えて

2

問題が見つかりました。私がしなければならなかったのは、 "LARGEADDRESSAWARE"フラグを実行可能ファイルに追加することだけでした。それがなければ、1GBが限界でした。テクスチャごとに300MBという非常に簡単に達成できました。

もちろん、そのデータのほとんどがラージオブジェクトヒープになっているため、GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnceも役に立ちました。

ご迷惑をおかけして申し訳ありません。

関連する問題