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

本文关键字:何避免 泄漏 VertexDeclaration 内存 SlimDX | 更新日期: 2023-09-27 18:01:04

我的SlimDX/DDirectX应用程序出现问题。我使用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吗?还是垃圾收集器负责处理这个问题?我已经研究了几个示例源代码,许多程序员都这样做了——但它在循环中运行时不是会占用越来越多的内存吗?

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

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

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

SlimDX是非托管代码互操作的世界(更重要的是,因为它运行图形API,该API还分配和释放图形卡上的内存(,它有一系列全新的问题,这些问题在纯托管代码中是找不到的。这就是为什么您很可能找不到垃圾收集器按预期运行的原因。