1

画面に 1 つの Texture2D を描画しています。このテクスチャは、空白 (完全に透明) の 800*350 テクスチャとして開始されます。このテクスチャは、LoadContent から blankTexture と FilledTexture として 2 つの異なるテクスチャにロードされます。次に、update メソッドで、filledTexture にピクセルを描画します。FilledTexture はスプライト バッチで描画され、プロセスが繰り返されます。

FilledTexture は、各 update 呼び出しの開始時に「更新」され、そこにあったピクセルが取り除かれるため、再充填できるようになります。テクスチャを更新しても古いデータが適切に削除されないことがわかり、ここから問題が始まりました。まず、すべての呼び出しの開始時にfilledTexture =をblankTextureに設定しようとしましたが、これでも前の呼び出しからのデータが保持されていました。次に、次のことを試しました。

    public void LoadContent(graphicsDeviceManager graphics, ContentManager content)
    {
        //some code

        blankTexture = content.Load<Texture2D>("blank");
        filledTexture = content.Load<Texture2D>("blank");

        //some more code
    }

   public void Update()
   {       
        filledMap = new Texture2D(graphicsDevice.GraphicsDevice, blankMap.Width, blankMap.Height);

        //some code that messed around with the pixel locations
        Color[] color = new Color[1];
        color[0] = someNewColor;
        //some code that set the new position of the pixel

        //where R is a 1x1 rectangle with some location
        //this sets one pixel of the filledMap at a time at R.Location
        filledMap.SetData(0, R, color, 0, 1);


   }

   public void Draw(SpriteBatch batch)
   {
         batch.Draw(filledMap);
   }

現在、これらの方法は問題なく機能します。ただし、20 秒ごとにフレーム レートが約 20 ~ 30 ポイント低下し、その後通常に戻ります。すべてのコードパスが常に実行され、ピクセル数が一定の割合で増加し、そこにとどまっているため、フレームのドロップがそれほど一貫していないため、この理由はおそらくわかりませんでした.

タスク マネージャーを開いて物理メモリを調べたところ、RAM が 20 秒ごとにいっぱいになり、ダンプしていることがわかりました。各更新の開始時に、filledMap を新しい Texture2D に設定するコード行をコメント アウトした後、メモリ リークはなくなりました (20 秒ごとに約 1.5 ギガが満たされ、ダンプされました)。ですから、メモリを適切にクリアする方法についていくつかのアイデアが必要です! texture.SetData を使用すると、フレーム レートが高すぎます (すぐに約 2 FPS に低下します)。何か案は?

助けてくれてありがとう!

4

2 に答える 2

1

ただの提案です。

( MSDN ) クラスは を実装しているためTexture2D、不要になったときにテクスチャでメソッドを実行できます。これにより、テクスチャによって使用されている管理されていないリソースが解放され、おそらくメモリが解放されます。IDisposableDispose

于 2013-02-27T21:35:39.170 に答える
0

filledMap.Dispose()Update メソッドの最後に追加してみてください。

于 2013-02-27T21:41:17.803 に答える