2009-06-29 52 views
2

我正在寫一個XNA程序,顯示Zune上特定圖片專輯的圖片。問題是,如果我從相冊中的所有圖片加載紋理,則程序內存不足。我嘗試一個接一個的加載,並在用戶移動到下一張圖片時調用前一個圖片紋理上的Dispose。這種方式很有效,但之後我無法從之前的圖片取回紋理,因此用戶無法在不重新啓動程序的情況下查看過去的圖片!如何在Zune XNA中加載圖片而不會導致內存不足?

+0

爲什麼不重新加載它,使用相同的邏輯? – GalacticCowboy 2009-06-29 16:11:51

+0

好吧,我必須經過檢索所有圖片,然後在將它們呈現給用戶之前按順序對它們進行排序。每當用戶按下後退按鈕查看過去的圖片時,這樣做會很瘋狂。當然有更好的解決方案? – anonymous 2009-06-29 16:25:09

回答

1

不要在相冊中存儲每個項目的紋理句柄。相反,使用您在處理專輯時按需處理和加載的單個程序級句柄。

+0

是的,這是我在做什麼。我只有一個紋理手柄隨時參考一個圖片紋理。但是,一旦從圖片訪問紋理,即使爲手柄分配了不同的紋理,紋理也不會消失。它似乎被緩存在某處。如果我在紋理上調用Dispose,我無法從圖片中取回紋理。每次我調用GetTexture時它都會一直返回null。 – anonymous 2009-06-29 16:41:15

0

我會建議你只做一次數據處理,並存儲文件名(所以你只需要做所有的層次/排序一次)。然後只需要加載一張圖片(正如前一篇文章所建議的那樣)。

這個方法的問題是Content.Load(string)會加載你的紋理,但是如果你失去了指向紋理的所有指針,那麼ContentManager將把紋理保留在內存中,這樣如果你再次加載它,它會立即加載。有一種方法Content.Unload(),這將刪除這些緩存的項目,請參閱:

關於這個主題的論壇討論:
http://forums.xna.com/forums/p/25978/141761.aspx
肖恩哈格里夫斯解釋它:
http://blogs.msdn.com/shawnhar/archive/2006/09/06/743437.aspx

的方式我將實現這是要麼每次你停止使用圖片調用卸載,或者如果你想更快的加載(這取決於用戶多久改變一次圖片,如果他們打算通過圖片輕鬆地快速卸載每一次是一個壞主意)嘗試捕捉內存異常,只調用卸載恩。

相關問題