【发布时间】:2012-07-08 13:45:18
【问题描述】:
我的游戏已经到了产生过多垃圾并导致 GC 时间过长的地步。我一直在四处走动,减少了很多产生的垃圾,但是有一个地方过于频繁地分配了大量内存,我一直不知道如何解决这个问题。
我的游戏是一个 Minecraft 类型的世界,在你行走时会生成新的区域。我有一个大的、可变大小的数组,它是在创建用于存储地形顶点数据的新区域时分配的。数组填充数据后,将其传递给 slimdx DataStream,以便用于渲染。
问题在于这是一个可变大小的数组,需要将它传递给 slimdx,它会在其上调用 GCHandle.Alloc。由于它的大小可变,因此可能必须调整大小才能重用它。我也不能只为每个区域分配一个最大大小的数组,因为它需要大量的内存。由于与 slimdx 的 GCHandle 业务,我无法使用列表。
到目前为止,仅在需要增大数组时才调整数组的大小对我来说似乎是唯一可行的选择,但它可能效果不佳,实施起来可能会很痛苦。我需要单独跟踪数组的实际大小,并使用不安全的代码来获取指向数组的指针并将其传递给 slimdx。它最终也可能最终使用大量内存,以至于我不得不偶尔将所有数组的大小减小到所需的最小值。
我对这个解决方案犹豫不决,想知道是否有人对此有更好的解决方案。
【问题讨论】:
-
你确定只是创建数组吗?数组是否包含类对象或结构?如果它确实包含类,则可能是您确实创建了一个大而复杂的对象图,这将花费 GC 更长的时间来检查垃圾。
-
它是一个结构数组。该结构包含 3 个结构 (Vector3) 和 2 个浮点数。 CLR 分析器分配图将此结构列为最大的违规者,将近 300MB (25%)。
标签: c# garbage-collection slimdx