1

我的 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?也许SlimDX 的 VertexDeclaration 的 C++ 源代码有问题?还是我必须定义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,还是垃圾收集器会处理这个问题?我一直在研究几个示例源代码,许多程序员都这样做——但是在循环中运行时它不会使用越来越多的内存吗?

4

1 回答 1

2

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

SlimDX 中的许多类型也实现了该IDisposable接口,因此.Dispose()在清理完它们后调用它们是个好主意。

SlimDX 处于非托管代码互操作的世界中(更重要的是,因为它运行一个图形 API,它还分配和释放显卡上的内存),它有许多你不会发现的全新问题纯托管代码。这就是为什么您很可能没有发现垃圾收集器的行为与您期望的一样。

于 2011-07-05T12:43:22.280 回答