これは XNA のバグのはずです。
currentModel と nextModel の 2 つの 3D モデルがあり、これら 2 つのモデルに特殊効果を適用して、互いにモーフィングしたいと考えています。
コード:
void DrawModelMorphing(Model currentModel, Model nextModel)
{
int targetIndex = 0;
foreach(var mesh in currentModel.Meshes.Count)
{
foreach(var mp in mesh.MeshParts)
{
GraphicsDevice.Indices = mp.IndexBuffer;
VertexBufferBinding[] vertexBufferBindings = new VertexBufferBinding[2];
vertexBufferBindings[0] = new VertexBufferBinding(mp.VertexBuffer, mp.VertexOffset);
vertexBufferBindings[1] = new VertexBufferBinding(nextModel.Meshes[targetIndex].MeshParts[0].VertexBuffer, nextModel.Meshes[targetIndex].MeshParts[0].VertexOffset);
GraphicsDevice.SetVertexBuffers(vertexBufferBindings);
mEffect.CurrentTechnique.Passes[0].Apply();
GraphicsDevice.DrawIndexedPrimitives(
PrimitiveType.TriangleList,
0,
0,
mesh.MeshParts[0].NumVertices,
mesh.MeshParts[0].StartIndex,
mesh.MeshParts[0].PrimitiveCount);
//vertexBufferBindings[0].VertexBuffer.Dispose(); //exception
//vertexBufferBindings[1].VertexBuffer.Dispose(); //exception
}
}
targetIndex++;
}
}
GraphicsDevice.SetVertexBuffers
重大なメモリ リークが発生し、30 分で 300MB になり、「メモリ不足」になります。
別の関数呼び出しでの同様の問題の 1 つを次に示します。 キューブを描画するときの OutOfMemory Exception
私がテストしたもの:
1) イベントをvertexBufferBindings[]
グローバルに定義すると、問題が残ります。
2) 頂点バッファーを破棄すると、例外が発生します。「タイプ 'System.ObjectDisposedException' の初回例外が Microsoft.Xna.Framework.dll で発生しました」
3) GC および freeMem などのサードパーティ製ツールも機能しません。
誰でもこれについて助けることができますか?
プロジェクトで XNA を使用するのをやめたいと思っています。
ありがとう。
編集:
解決策は、必要なものすべてをキャッシュすることです。たとえば、VertexBuffer と Textural です。