0

これは 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 です。

4

1 に答える 1

1

割り当てた要素に対して DISPOSE を呼び出したことはありますか? そうでない場合 - いいえ、申し訳ありませんが、デバイス メモリは管理されていません。対応するクラスは IDisposable を実装する必要があり、クリーンアップする必要があります。

GCが役立つと仮定すると、まさにこれが起こります。

于 2013-01-06T17:30:51.723 に答える