2011-07-05 50 views
1

我的SlimDX/DirectX應用程序出現問題。我有一個循環使用SlimDX的MessagePump,並且我的應用程序使用過量的內存時出現問題,而內存越來越多。我試着找一下我的代碼的一部分這樣做,而且我發現,它可能是這樣的:SlimDX VertexDeclaration內存泄漏? - 如何避免它?

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 MB的內存

如何避免內存泄漏VertexDeclaration?也許C++ source code of SlimDX's VertexDeclaration有什麼問題嗎?或者我必須在循環外定義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,還是垃圾收集器處理這個問題?我一直在研究幾個示例源代碼,許多程序員都這樣做 - 但是在循環中運行時不會使用越來越多的內存?

回答

2

對於任何你將重複使用的變量/引用,如果他們沒有改變,最好在循環之外的地方聲明它們。

SlimDX中的許多類型都實現了IDisposable接口,所以當你完成清理工作時,最好給他們打電話.Dispose()

SlimDX處於非託管代碼互操作的世界(甚至更多,因爲它運行的圖形API也分配和釋放內存在顯卡上),它有一個全新的主機問題,你不是將在純粹的託管代碼中找到。這就是爲什麼你最有可能找不到垃圾收集器,就像你期望的那樣。

+1

謝謝,我在使用vertexDecl.Dispose()之後使用它,它不再使用越來越多的內存。也感謝您解釋垃圾回收器問題。 :) – TomsonTom