2012-03-25 27 views
2

我的問題是不明確的標題[我不會寫它到底]XNA怎樣的ContentManager內存處理

e.g Texture2D picture = Content.Load<Texture2D>("myPicture");

是什麼,如果上面的代碼運行在內存發生?據我所知,Content將「myPicture」緩存到內存中,並返回對Texture2D圖片的引用。我錯了嗎 ?如果「myPicture」被加載到另一個Texture2D對象,則「myPicture」不會重複,因此它只返回一個引用。

是否每個文件(或內容文件)通過內容加載緩存到內存(也在RAM上分配)而不重複? (我相信這是我的問題,所有上面寫的應該檢查)

謝謝!

回答

9

ContentManager的每個實例只會加載任何給定的資源一次。第二次請求資源時,它將返回上次返回的相同的實例。

ReferenceEquals(Content.Load<Texture2D>("something"), 
       Content.Load<Texture2D>("something")) == true 

要做到這一點,ContentManager維護所有已內部加載的內容列表。此列表可防止垃圾收集器清理這些資源 - 即使您沒有使用它們。

要卸載資源並清除內部列表,請致電ContentManager.Unload。這將釋放加載的資源正在使用的內存。現在,如果再次請求相同的資源 - 它將被重新加載。

當然,如果你使用這些資源,當你調用Unload,所有你會加載設置,並不能使用這些共享實例。

最後,不要叫Dispose任何東西散發出來的ContentManager.Load,因爲這會破壞正在共享的所有實例,並會導致問題時ContentManager試圖在Unload以後處置。

+0

感謝帖子!更多的是加載的資源在內存中,對吧? (你的關於卸載的句子讓我清楚,但我再次問這個問題,我的英語不夠完全理解。) – icaptan 2012-03-26 13:30:22

+0

恐怕我不明白你的問題。 – 2012-03-27 00:13:24

+0

Texture2D picture = Content.Load (「myPicture」);在運行這一行後,myPicture被加載到內存(到計算機的內存)並且它的引用被Content返回到Texture2D實例圖片。 - >真或假?謝謝 ! – icaptan 2012-03-27 07:26:38