2017-03-20 21 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의로드 폐기 할 것. 그러나 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로 이동할 때가되었습니다 ...

+0

32 비트 (x86) 또는 64 비트 기본을 사용하고 있습니까? 비디오 메모리를 단편화하거나 '메모리 부족'상태가되어 비정상적인 장소에서 오류가 발생할 수 있습니다 (따라서''E_FAIL''). 디버그 장치에서 출력을 찾으십시오. –

+0

@ChuckWalbourn 32 비트이지만 일반적으로 약 200 MB RAM 이상을 차지하지 않습니다 (장면을로드하는 경우를 제외하고는 일반적으로 한 장면 당 하나의 거대한 200 MB 텍스처 - 360 ° 파노라마 용). 슬프게도, 나는 디버그에서 유익한 것을 발견 할 수 없다. 'EnableObjectTracking'과'DetectDoubleDispose'는 모두 활성화되어 있으며, 모든 것이 적절하게 처리 된 것처럼 보입니다. –

+0

장치의 max_texture 크기를 확인하십시오. 사용량이 192MB를 초과하지 않습니다. – Nain

답변

2

발견. 내가 할 일은 "LARGEADDRESSAWARE"플래그를 실행 파일에 추가하는 것입니다. 그것 없이는, 1GB가 한계였습니다 - 텍스처 당 300MB로 아주 쉽게 달성 할 수있었습니다.

물론 데이터의 대부분이 Large Object Heap으로 끝나기 때문에 GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce도 도움이되었습니다.

죄송합니다.