我目前的项目包括一个植被模拟,能够渲染大量随时间生长和繁殖的树模型。
我目前在这行代码中遇到一致的 OutOfMemory 异常
if (treeInstances.Length <= currentIndex)
Array.Resize(ref treeInstances, currentIndex + 500);
此代码在模拟超出treeInstances
数组的通常边界时运行,并导致它分配一个新数组,其中包含额外的 500 个树槽。
鉴于我可以看到数组失败时的大小(通常在 3000 到 5000 个实例之间)和TreeInstance
结构的大小(20 个浮点数),我确信我的问题不在于数组的原始大小。即使考虑到它必须在 resize/8 过程中临时加倍(因为Array.Resize()
分配了一个新数组),假设我的数学是正确的,它仍然不到半 MB。
因此,我认为一定有我遗漏的东西。垃圾收集器可能不会删除旧数组是否有某种原因?
更多细节:
TreeInstance
是一个简单的结构,具有每棵树的变换矩阵和颜色。treeInstances
是一个TreeInstance[]
数组。它只在这里直接使用,在上面的代码行中。treeInstances
还有一个 Property,TreeInstances
,它通过get;set;
TreeInstances
用于设置每棵树生长时的变换矩阵和颜色,并作为Draw
例程的一部分输入到实例化方法中。- 我不太熟悉的 Instancing 方法,但在
TreeInstances
不修改其内容的情况下执行各种功能(包括将其用作DynamicVertexBuffer.SetData
操作中的源)。