가끔씩 내 앱이 일련의 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
의로드 폐기 할 것. 그러나 FromMemory()
은 앱을 다시 시작한 후에 만 다시 작업을 시작합니다. 그 밖의 무엇이 잘못 될 수 있는지 말해 주시겠습니까?
UPD :
는 Texture2D.FromMemory()
으로, 나는 얻을이 :
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()
이 실제로 어떻게 작동하는지 몰라 왜 메모리를 다시 할당하려고합니까? 어쩌면 x64로 이동할 때가되었습니다 ...
32 비트 (x86) 또는 64 비트 기본을 사용하고 있습니까? 비디오 메모리를 단편화하거나 '메모리 부족'상태가되어 비정상적인 장소에서 오류가 발생할 수 있습니다 (따라서''E_FAIL''). 디버그 장치에서 출력을 찾으십시오. –
@ChuckWalbourn 32 비트이지만 일반적으로 약 200 MB RAM 이상을 차지하지 않습니다 (장면을로드하는 경우를 제외하고는 일반적으로 한 장면 당 하나의 거대한 200 MB 텍스처 - 360 ° 파노라마 용). 슬프게도, 나는 디버그에서 유익한 것을 발견 할 수 없다. 'EnableObjectTracking'과'DetectDoubleDispose'는 모두 활성화되어 있으며, 모든 것이 적절하게 처리 된 것처럼 보입니다. –
장치의 max_texture 크기를 확인하십시오. 사용량이 192MB를 초과하지 않습니다. – Nain