SlimDX VertexDeclaration内存泄漏? - 如何避免它?

时间:2011-07-05 12:20:38

标签: c# memory-leaks slimdx

我的SlimDX / DirectX应用程序出了问题。我有一个使用SlimDX的MessagePump制作的循环,我的应用程序使用了过多的内存,这个问题在增加。我试图找到我的代码的哪一部分,并且我发现它可能是这样的:

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())运行,每秒耗尽大约2 MB内存

如何避免VertexDeclaration中的内存泄漏?也许C++ source code of SlimDX's 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,还是垃圾收集器会处理这个问题?我一直在研究几个示例源代码,许多程序员都这样做 - 但是在循环中运行时它不会使用越来越多的内存吗?

1 个答案:

答案 0 :(得分:2)

对于你将重复使用的任何变量/引用,如果没有它们改变,最好在循环之外的某处声明它们。

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

SlimDX处于非托管代码互操作的世界(更是如此,因为它运行的图形API也可以分配和释放显卡上的内存),这会带来一系列你不会去的问题在纯托管代码中查找。这就是为什么你很可能没有找到像你期望的那样的垃圾收集器。