我目前的項目包括一個植被模擬,能夠渲染大量隨時間增長和再現的實例樹模型。如何在Array.Resize期間防止OutOfMemory異常?
我目前得到的這行代碼
if (treeInstances.Length <= currentIndex)
Array.Resize(ref treeInstances, currentIndex + 500);
當仿真超過treeInstances
陣列通常的界限此代碼運行,並導致它分配一個新的數組附加一致OutOfMemory異常樹木500個插槽。
鑑於我可以看到它失敗時的數組大小(通常在3000到5000個實例之間)和TreeInstance
struct(20浮點數)的大小,我確定我的問題不在於原始大小的陣列。即使考慮到在resize/8過程中(因爲Array.Resize()
分配了一個新數組),在假設我的數學正確的情況下它仍然不到半個MB,它必須暫時加倍。
因此,我假設一定有一些我錯過了。垃圾收集器可能不會刪除舊數組嗎?
更多細節:
TreeInstance
是一個簡單的結構,每個樹的變換矩陣和顏色。treeInstances
是TreeInstance[]
陣列。它僅在這裏直接使用,在上面的代碼行中。treeInstances
還具有屬性,TreeInstances
,其經由get;set;
TreeInstances
訪問它用於設置,因爲它生長的變換矩陣,並且每個樹的顏色,和被饋送到實例化方法作爲Draw
例程的一部分。- 我不太熟悉的Instancing方法,但使用
TreeInstances
執行各種功能而不修改它的內容(包括將它用作DynamicVertexBuffer.SetData
操作中的源代碼)。
你爲什麼要分配自己的數組?你有沒有考慮使用名單?根據所涉及的數組大小,+500分配可能不是增長數組的最有效方式。他們可能會在大對象堆上留下漏洞。如果可能,我的建議是使用列表。如果不使用內存分析器並查看內存佔用情況。 –
hawk
考慮到你的結構中有20個浮點數,並且在數組中有3000-5000個元素,你肯定會在大對象堆中結束。一種策略是預先分配足夠大的陣列。 – hawk
我正在使用我自己的數組,因爲實例化繪製方法將數組作爲參數,並且它似乎是直接分配數組的更好方法,而不是每秒60次調用列表 .ToArray()。不過,我現在還不能確定。 –
Quasar