Утечка памяти в SlimDX VertexDeclaration?- Как этого избежать? - PullRequest
1 голос
/ 05 июля 2011

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

1 Ответ

2 голосов
/ 05 июля 2011

Для любых переменных / ссылок, которые вы будете использовать повторно, без их изменения, было бы неплохо объявить их где-то вне цикла.

Также многие типы в SlimDX реализуют интерфейс IDisposableтак что это хорошая идея, чтобы вызывать .Dispose() для них, когда вы закончите, чтобы очистить их.

SlimDX находится в мире взаимодействия неуправляемого кода (и даже более того, так как он запускает графикуAPI, который также выделяет и освобождает память на видеокарте), в котором есть целый ряд проблем, которые вы не найдете в чисто управляемом коде.Вот почему вы, скорее всего, не найдете сборщик мусора, действующий так, как вы ожидаете.

...