Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SlimDX VertexDeclaration内存泄漏?-如何避免呢?_C#_Memory Leaks_Slimdx - Fatal编程技术网

C# SlimDX VertexDeclaration内存泄漏?-如何避免呢?

C# SlimDX VertexDeclaration内存泄漏?-如何避免呢?,c#,memory-leaks,slimdx,C#,Memory Leaks,Slimdx,我的SlimDX/DirectX应用程序有问题。我使用SlimDX的消息泵创建了一个循环,我的应用程序使用了过多的内存,内存正在增加。我试图找出代码的哪一部分起作用,我发现可能是这样的: var vertexElems = new[] { new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0), new V

我的SlimDX/DirectX应用程序有问题。我使用SlimDX的
消息泵
创建了一个循环,我的应用程序使用了过多的内存,内存正在增加。我试图找出代码的哪一部分起作用,我发现可能是这样的:

var vertexElems = new[] {
    new VertexElement(0, 0, DeclarationType.Float4, DeclarationMethod.Default, DeclarationUsage.PositionTransformed, 0),
    new VertexElement(0, 16, DeclarationType.Color, DeclarationMethod.Default, DeclarationUsage.Color, 0),
    VertexElement.VertexDeclarationEnd
};

var vertexDecl = new VertexDeclaration(device, vertexElems);
这部分代码在一个恒定的循环中运行(
MessagePump.Run()
),并且每秒钟多消耗大约2MB的内存

如何避免VertexDeclaration中的内存泄漏?也许这里面有什么不对劲?或者我必须在循环之外定义
VertexDeclaration
?为什么垃圾收集器不处理它呢

与此相关的一个类似的问题是:如果我在循环中定义新变量,而实际上只使用一次,这是一个问题吗?例如,此代码:

Matrix T, S;
T = Matrix.Translation(mShipPos.X, mShipPos.Y, mShipPos.Z);
S = Matrix.Scaling(20.0f, 20.0f, 0.0f);
mSprite.Transform = S * T;

循环运行。这是一个问题吗?我应该在循环之外定义矩阵T和S,还是垃圾收集器会处理这个问题?我一直在研究几个示例源代码,许多程序员都在这样做——但在循环中运行时,它不会占用越来越多的内存吗?

对于您将重复使用的任何变量/引用,在不改变它们的情况下,最好在循环之外的某个地方声明它们

SlimDX中的许多类型也实现了
IDisposable
接口,因此在清理它们时,最好对它们调用
.Dispose()


SlimDX处于非托管代码互操作的世界中(更是如此,因为它运行的图形API还可以分配和释放图形卡上的内存),这带来了一系列全新的问题,这些问题在纯托管代码中是找不到的。这就是为什么您很可能发现垃圾收集器的工作方式与预期不同。

谢谢,我在使用vertexDecl.Dispose()后使用了它,它不再使用越来越多的内存。还感谢您解释垃圾收集器问题。:)