2013-01-06 58 views
0

這應該是XNA的錯誤。GraphicsDevice.SetVertexBuffers內存不足

我有兩個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會造成嚴重的內存泄露,300MB在30分鐘內,然後在 「內存不足」

這裏是不同的函數調用一個類似的問題: OutOfMemory Exception when drawing cube

我測試過的東西:

1)事件如果我定義全球10個,問題依然存在。

2)如果我處理頂點緩衝區,會有異常。 「Microsoft.Xna.Framework.dll中發生類型'System.ObjectDisposedException'的第一次機會異常」

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

任何人都可以幫忙嗎?

我幾乎想放棄在我的項目中使用XNA。

謝謝。

編輯:

的解決方案是緩存我所需要的一切,如:VertexBuffer和紋理

+0

我試着修復你的代碼格式,但似乎你在兩個循環之外都有'targetIndex ++;'。也許這是造成這個? – user1306322

+0

幾乎沒有。 IndexOutOf BOund異常......你知道......他們被拋出。但創建新的索引緩衝區而不處理它們 - 這就創造了這個。 – TomTom

+0

您是否曾嘗試對兩個頂點緩衝區使用「using」語句? – Deukalion

回答

1

你曾經調用Dispose你分配這些元素?如果沒有 - 不,對不起,設備內存不受管理,相應的類必須實現IDisposable,並且您必須清理。

如果您認爲GC有幫助,則會發生這種情況。

+0

我累了vertexBufferBindings [0] .VertexBuffer.Dispose(),但它給System.ObjectDisposedException' –

+0

Tehen修復它。對不起,你有你的指針,我不是在這裏用我的水晶球來看看你的確切的錯誤信息,並找出代碼 - 我不知道也不想知道 - 是怎麼回事。事實是,你沒有配置SOMETHING,因此它吃掉了非託管內存。也許這是你的代碼中的其他東西,你不會處理。 – TomTom

+0

也許你只是應用一個內存分析器,並查看內存中的哪些對象 - 如果其中一些具有大的非託管引用,那麼你去。 – TomTom