GraphicsDevice.SetVertexBuffers内存不足

时间:2013-01-06 16:31:02

标签: c# 3d xna out-of-memory

这应该是XNA的错误。

我有两个3D模型,currentModel和nextModel,我想对这两个模型应用特殊效果,比如说变换到另一个模型。

代码:

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,然后“内存不足”

以下是不同函数调用的一个类似问题: OutOfMemory Exception when drawing cube

我测试过的东西:

1)如果我全局定义vertexBufferBindings[],则问题仍然存在。

2)如果我处理顶点缓冲区,则会有异常。 “Microsoft.Xna.Framework.dll中出现'System.ObjectDisposedException'类型的第一次机会异常”

3)GC和某些第三方工具(如freeMem)也不起作用。

有人可以帮忙吗?

我几乎想放弃在我的项目中使用XNA。

感谢。

编辑:

解决方案是缓存我需要的所有内容,例如:VertexBuffer和Textural

1 个答案:

答案 0 :(得分:1)

您是否曾对您分配的元素调用DISPOSE?如果不是 - 不,抱歉,设备内存是不受管理的,相应的类必须实现IDisposable,你必须清理。

如果您认为GC有帮助,那么确实会发生这种情况。