2010-10-08 88 views
3

我目前正在研究幾個windows手機項目(雖然這個問題也可能適合iphone/android),它讓我想到了什麼時候是從內容管理器加載紋理的最佳時機。什麼時候加載紋理?

起初,我是從我的遊戲基類中加載它們,然後根據需要傳遞它們。我很快厭倦了這一點,我創建了一個小型資源管理器課程,我將其分發給任何需要它的東西。

所以我想,也許這是最好的,我實際上加載紋理,當一個類需要它,然後將其分配給一個變量,所以當我再次需要它 - 這將是所有準備去...這是處理加載資源的最好方法(高效?,最快?)?如果沒有,你會如何推薦我去做呢?

回答

7

不要創建任何類型的「資源管理器」類。只需通過XNA ContentManager類(您從Game.Content獲得的實例)。

默認的內容管理器會自動爲您處理重用加載的對象。所以你可以從多個地方Content.Load<Texture2D>("something"),你總是會得到相同的紋理實例。

所以,如果你有一堆類的遊戲對象,用給每個的Update標準設計和Draw方法,你從Game各自的方法調用 - 只需添加另一種方法:LoadContent這些類,接受ContentManager的參數。

您可以從遊戲的LoadContent方法調用該方法。如果您以後希望實現某種延遲加載系統(例如:在更改關卡時加載內容),您還可以從遊戲的Update方法中調用您的遊戲類的方法(但保留記住加載內容很慢 - 所以你可能想拋出一個「加載」屏幕)。

卸載內容有點棘手。你自己創造的任何東西都必須卸載。但是從ContentManager加載的任何內容(因爲實例已共享)只能由該內容管理器卸載(Game將在需要時處理其卸載Content成員)。您可能會發現this blog post值得閱讀。

+0

傳遞contentManager類會比調用GameState.Instance.LoadTexture2D(「Texture」)更好嗎? – Tim 2010-10-09 00:12:42

+0

我在想GameState是單身嗎?它不是*糟糕的*,但我發現傳遞一個ContentManager在長期內更加靈活。此外,我甚至不會打擾單身 - 如果你想要走這條路線 - 只需將其設置爲「public static」,並在Game類中進行初始化。 (這是我的遊戲開發答案 - 正確的軟件工程答案很簡單:「是!」) – 2010-10-09 16:06:23