我的游戏已经到了产生过多垃圾并导致 GC 时间过长的地步。我一直在四处走动,减少了很多产生的垃圾,但是有一个地方过于频繁地分配了大量内存,我一直坚持如何解决这个问题。
我的游戏是一个 Minecraft 类型的世界,当你走路时会生成新的区域。我有一个大的、可变大小的数组,它是在创建用于存储地形顶点数据的新区域时分配的。数组填充数据后,将其传递给 slimdx DataStream,以便用于渲染。
问题在于这是一个可变大小的数组,需要将它传递给 slimdx,它会在其上调用 GCHandle.Alloc。由于它的大小可变,因此可能必须调整大小才能重用它。我也不能只为每个区域分配一个最大大小的数组,因为它需要大量的内存。由于与 slimdx 的 GCHandle 业务,我无法使用列表。
到目前为止,仅在需要更大时调整数组的大小似乎是我唯一可行的选择,但它可能效果不佳,实施起来可能会很痛苦。我需要单独跟踪数组的实际大小,并使用不安全的代码来获取指向数组的指针并将其传递给 slimdx。它最终也可能最终使用大量内存,以至于我不得不偶尔将所有数组的大小减小到所需的最小值。
我犹豫要不要跳过这个解决方案,并想知道是否有人对此有更好的解决方案。