我的遊戲已經到了產生過多垃圾並導致GC時間長的地步。我一直在四處走動,減少了大量垃圾產生,但有一個地方太頻繁地分配大量內存,我一直在堅持如何解決這個問題。如何減少這種情況下的垃圾產生
我的遊戲是一個世界級的世界,當你走路時會產生新的區域。我有一個大的,可變大小的數組,用於創建一個用於存儲地形頂點數據的新區域。數組填充數據後,將其傳遞給slimdx DataStream,以便用於渲染。
問題是,這是一個可變大小的數組,它需要傳遞給slimdx,它調用GCHandle.Alloc。由於它的大小可變,因此可能需要重新調整大小才能重新使用它。我也不能只爲每個區域分配一個最大大小的數組,因爲它需要不可能的大量內存。由於GCHandle與slimdx的業務,我無法使用列表。
到目前爲止,只有當需要使數組變大時才調整數組大小似乎是我唯一合理的選擇,但它可能無法很好地實現,並且可能會很難實現。我需要分別跟蹤數組的實際大小,並使用不安全的代碼來獲取指向數組的指針並將其傳遞給slimdx。它最終最終可能會使用如此大量的內存,我偶爾會將所有陣列的大小降低到所需的最小值。
我很猶豫跳到這個解決方案,想知道是否有人看到任何更好的解決方案。
你確定它只是數組創建嗎?數組是否包含類對象或結構體?如果它確實包含類,則可能是您創建了一個大而複雜的對象圖,它將花費更長的時間來檢查垃圾。 – 2012-07-07 04:39:56
它是一個結構數組。該結構包含3個結構體(Vector3)和2個浮點數。 CLR分析器分配圖將此結構列爲最大的違規者,數量接近300MB(25%)。 – Telanor 2012-07-07 05:58:54