加载大型场景时C#SharpDX设备E_OUTOFMEMORY异常

时间:2018-01-17 12:03:08

标签: c# out-of-memory sharpdx

我正在编写一个SharpDX(v4.0.1)应用程序,它显示由许多(可能是非常大的)独立部分组成的程序集。每个部分都有自己的顶点和索引缓冲区。当我尝试加载一个非常大的程序集时,我最终在尝试为部件创建顶点缓冲区时遇到E_OUTOFMEMORY异常:

int size = _meshVertices.Length * Utilities.SizeOf<MeshVertex>();
BufferDescription descr = new BufferDescription(size, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
_vertexBuffer = Buffer.Create(_device.Device, _meshVertices, descr);

$exception  {"HRESULT: [0x8007000E], Module: [General], ApiCode: [E_OUTOFMEMORY/Out of memory], Message: Not enough storage is available to complete this operation.\r\n"}  SharpDX.SharpDXException

当我在谷歌搜索一个可能的解决方案时,我发现资源有一个大小限制 - 但似乎并非如此,因为即使是较小的部分也会发生这种情况。

我尝试的另一个解决方案是使用MemoryFailPoint类在创建缓冲区之前尝试保留内存。但我想这会检查可用的RAM,而我认为异常是由于GPU内存不足造成的。无论如何,这似乎有点缓解了这个问题,但它并没有完全解决它。它失败之前需要更长的时间。

int size = _meshVertices.Length * Utilities.SizeOf<MeshVertex>();
using (System.Runtime.MemoryFailPoint memFailPoint = new System.Runtime.MemoryFailPoint(size / 1024 / 0124))
{
    BufferDescription descr = new BufferDescription(size, ResourceUsage.Default, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0);
    _vertexBuffer = Buffer.Create(_device.Device, _meshVertices, descr);
}

我的问题是,在我收到异常后,设备丢失了。我假设顶点缓冲区等资源绑定到设备,因此在设备丢失后重新创建设备意味着重新创建所有非常耗时的资源。

所以最好,我正在寻找一种方法来了解设备在我尝试创建缓冲区之前没有足够的内存,这样我就可以根据需要丢弃单个部分。有可能做那样的事吗?

非常感谢任何帮助。我是SharpDX的新手,所以如果你认为我误解了这个问题并且其他原因造成了这个问题,请告诉我。提前感谢您对此的任何意见。

0 个答案:

没有答案