2013-02-27 367 views
1

我正在繪製一個Texture2D到屏幕。這種紋理起始於空白(完全透明)800 * 350紋理。此紋理從LoadContent加載到兩個不同的紋理,分別爲blankTexture和filledTexture。然後在我的更新方法中將像素繪製到filledTexture。填充的紋理用sprite批次繪製,並且重複該過程。如何釋放Texture2D數據/內存? XNA

的filledTexture是「更新」,在每次更新呼叫開始,以擺脫在那裏的像素,因此它可以補充。我發現更新紋理根本沒有正確擺脫舊的數據,這裏就開始了這些問題。首先,我嘗試在每次調用開始時將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點,然後恢復正常。我不可能看到一個原因,因爲所有代碼路徑都是不斷運行的,像素數量以恆定的速度上升並停留在那裏,所以幀丟失不會那麼不穩定。

我打開任務管理器,看了看物理內存,aaaand原來的RAM被填滿和傾銷本身每20秒左右。在每次更新開始時註釋掉將fillMap設置爲新的Texture2D的代碼行後,內存泄漏消失了(大約每1.5秒裝滿一次,並且每20秒鐘進行一次轉儲)。所以我需要一些關於如何正確清理內存的想法!使用texture.SetData幀速率太高(它會快速下降到大約2 FPS),所以我想這種方法已經結束了。有任何想法嗎?

感謝您的幫助!

回答

1

只是一個建議。

Texture2DMSDN)類實現了IDisposable,所以當你不需要它時,你可以在紋理上運行Dispose方法。這將釋放紋理使用的任何非託管資源,並可能釋放內存。

+0

我確實嘗試過,但之後紋理變得無法使用。我可能一直在執行它錯誤。這是我當時所做的:drawTexture.Dispose()在繪製調用之後。然後在更新它會拋出一個異常,說我不能使用對象,因爲它已被釋放,當它擊中的是filledTexture =新的Texture2D(...) – Colton 2013-02-27 21:40:58

+0

嗯,說的代碼,這應該工作,所以什麼可能是錯的實現。你能發佈更新的樣本嗎? – 2013-02-27 21:49:59

+1

我很高興你讓我再試一次。不知何故,通過某種神奇的力量,第二次做了完全相同的事情,避免了數小時的計劃和塗鴉,來回擺動和頭痛。非常感謝你! – Colton 2013-02-27 22:02:38

0

試圖在Update方法的末尾添加filledMap.Dispose()