У меня проблема с моим приложением 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 МБ больше памяти .
Как избежать утечки памяти в VertexDeclaration
? Может быть, что-то не так в исходном коде C ++ VertexDeclaration SlimDX? Или я должен определить 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 вне цикла, или сборщик мусора позаботится об этом? Я искал несколько примеров исходных кодов, и многие программисты делают это, но разве он не использует все больше и больше памяти при работе в цикле?