我的游戏已经到了产生过多垃圾并导致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