我的当前项目涉及植被模拟,能够渲染大量的树木实例模型,并在时间上进行生长和繁殖。
目前我在这行代码中不断遇到内存溢出异常:
if (treeInstances.Length <= currentIndex)
Array.Resize(ref treeInstances, currentIndex + 500);
当模拟超出treeInstances
数组的常规边界时,此代码将运行,并导致它分配一个新数组,其中包含额外的500个树插槽。
考虑到我在它失败时可以看到数组的大小(通常在3000和5000实例之间),以及TreeInstance
结构的大小(20个浮点数),我确定我的问题不在于数组的原始大小。即使考虑到它在调整大小/8过程中必须被临时加倍(因为Array.Resize()
会分配一个新数组),如果我的计算正确,那也还不到半MB。
因此,我认为我可能漏掉了一些东西。是否有某些原因,旧的数组可能不会被垃圾收集器删除?
更多细节:
TreeInstance
是一个简单的结构体,包含每棵树的变换矩阵和颜色。treeInstances
是一个TreeInstance[]
数组。它仅在此处直接使用,出现在上面的代码行中。treeInstances
还有一个属性TreeInstances
,通过get;set;
访问它。TreeInstances
用于设置每棵树的变换矩阵和颜色,随着其生长,并作为Draw
例程的一部分馈送到实例化方法中。- 我不太熟悉实例化方法,但它执行各种功能,使用
TreeInstances
而不修改其内容(包括在DynamicVertexBuffer.SetData
操作中将其用作源)。