2017-03-20 49 views
4

我的应用程序不时初始化一堆DirectX的东西并加载场景,有时包含一些大纹理(每个纹理最多200-300 MB)。起初,一切工作正常,但经过一段时间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”标志添加到可执行文件中。没有它,1 GB是极限 - 每个纹理300 MB很容易实现。

另外,当然,由于大部分数据都以大对象堆结束,所以GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce也有帮助。

对不起,浪费你的时间。

相关问题