2011-07-05 8 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を定義する必要がありますか?なぜガベージコレクタはそれを処理しないのですか?

これに関連する同様の質問:実際にループを1回だけ使用すると、ループ内に新しい変数を定義すると問題はありますか?たとえば、次のコード:

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は、アンマネージドコードinteropの世界にあります(さらに、グラフィックカード上でメモリを割り当てたり解放するグラフィックスAPIを実行するため)純粋に管理されたコードで検索します。これは、ガベージコレクタが期待どおりに動作していない可能性が高い理由です。

+1

ありがとうございました。私はvertexDecl.Dispose()を使用した後で使用しましたが、これ以上メモリを使用しません。また、ガベージコレクタの問題について説明してくれてありがとう。 :) – TomsonTom

関連する問題