SlimDX 在一段时间后停止加载大纹理
SlimDX stops loading big textures after a while
我的应用程序有时会初始化一堆 DirectX 内容并加载场景,有时包含一些大纹理(每个纹理高达 200–300 MB)。起初,一切正常,但过了一会儿 FromMemory()
就停止工作了,但只适用于大纹理:
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()
只有在应用程序重新启动后才能再次开始工作。你能告诉我还有什么问题吗?
更新:
使用 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 了……
找到问题了。事实证明,我所要做的就是向可执行文件添加“LARGEADDRESSAWARE”标志。没有它,1 GB 就是极限 — 每个纹理 300 MB 很容易实现。
此外,当然,由于大部分数据最终都在大对象堆中,GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
也有帮助。
抱歉浪费您的时间。
我的应用程序有时会初始化一堆 DirectX 内容并加载场景,有时包含一些大纹理(每个纹理高达 200–300 MB)。起初,一切正常,但过了一会儿 FromMemory()
就停止工作了,但只适用于大纹理:
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()
只有在应用程序重新启动后才能再次开始工作。你能告诉我还有什么问题吗?
更新:
使用 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 了……
找到问题了。事实证明,我所要做的就是向可执行文件添加“LARGEADDRESSAWARE”标志。没有它,1 GB 就是极限 — 每个纹理 300 MB 很容易实现。
此外,当然,由于大部分数据最终都在大对象堆中,GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce
也有帮助。
抱歉浪费您的时间。