2011-01-21 72 views
1

我正在使用圖形引擎的關卡編輯器。最近,隨着一個項目的擴展,我遇到了內存問題。特別是,這個級別非常大,需要加載大約300個不同大小的紋理。一些紋理像2048x2048那麼大,其他像256x256或512x512更小。無論如何,編輯器會爲此級別消耗1.3GB的內存,並且某些紋理因爲拋出內存異常而無法加載。那麼我在這裏有什麼解決方案?XNA內存中加載的紋理太多

現在,我能想到的唯一解決方案是根據可見區域將級別劃分爲更小的部分並根據需要加載紋理。但我相信這會在現場導航時大大減緩性能。有什麼想法嗎?關於這個問題,關卡編輯應該有一些標準的方法。

回答

3

你基本上有兩種選擇

  1. 切換到基於區塊的方法。如果您使用瓷磚,那意味着您可以反覆使用相同的紋理,從而節省大量的內存。
  2. 按照您所述切換到按需。

我在想,如果你的藝術方向並沒有真正與基於瓦片的方法相結合,那麼你就會開始考慮方法2。有幾件事情要考慮

  • 它並不一定是緩慢的,只要你的「主動」區是足夠大,這樣你就不會通過加載過多捶打盤往往你應該罰款。
  • 衡量衡量尺度,你可能必須更好地掌握你的記憶預算,並設計你的水平,而不是設計你的水平,直到你碰壁。 :-)
  • 維護單獨的內容管理器,請記住,您無法卸載通過contentmanager加載的單個內容片段,因此請保留一份管理員列表,以便在您移動時可以交換。
+0

首先,感謝您的回答。現在,雖然我不熟悉基於瓦片的方法,但是一個紋理可以被多個對象使用。它不會在使用它的每個對象的內存中多次加載。我想說明紋理保存在Dictionary 中。我不使用內容管理器,我使用Texture2D.FromFile加載紋理。我可以嘗試按需求方式。使用內容管理器會保存任何內存嗎?我想不是,所以我應該堅持已經實施的方法。 P.S我只負責這些工具,「測量」由其他人完成:) – muku 2011-01-21 15:16:46

+0

哦,我明白了......內容管理器實際上只是運行時代碼,紋理貫穿內容管道。當你試圖運行遊戲時,我認爲你的意思是你的內存不足。但是你描述的機制是相同的概念......存儲對紋理的引用,以及在移動時加載/卸載。但要記住,要比屏幕略大一些,這樣如果用戶做小動作,就不必經常加載/重新加載。 – 2011-01-21 15:25:22

1

當你走近保持swaping它到128×128,256×256,512×512,等這可能是一個好主意,用不同品質的紋理效果的使用,如果你離我很遠使用64×64的紋理,然後.. 。重新考慮使用2056x2056的紋理,因爲它更好有4個貼圖紋理:)。

(注:生成MIP-地圖部分做到這一點,但不會在您的計算機上沒有可用內存)

編輯:也嘗試打開DXT5紋理壓縮,這可能節省大量的記憶!