【发布时间】:2010-09-02 17:34:39
【问题描述】:
我查看了 Array.Resize() 的实现,并注意到创建并返回了一个新数组。我的目标是在游戏过程中实现零内存分配,因此我需要避免创建任何新的引用类型。调整数组大小会触发前一个数组上的垃圾收集器吗?我正在创建自己的 2D 数组调整器,但它的功能本质上与 .NET Resize() 方法相同。
如果新数组比前一个数组小,但多余的对象已经放回通用对象池,这会调用 GC 吗?
在我的游戏循环中会不断创建数组,因此我需要尝试使其尽可能高效。我正在尝试创建一个 array pool 这样,因此无需继续在游戏中创建它们。但是,如果 resize 方法做同样的事情,那么不只是实例化一个新数组而不是拥有池是没有意义的。
感谢您的帮助
【问题讨论】:
-
也许你可以使用
List<T>,它基本上是一个自动调整大小的数组,我想当你缩小它时,它不会立即缩小数组......嗯,我必须检查...... -
@digEmAll:
List<T>在内部使用T[]但会为您调整大小。换句话说:它将创建新实例。 -
感谢您的建议。我想到了一个列表(因为我使用的是 2D 数组),但它对我的游戏来说稍微复杂一些。
-
@Brian:当然可以,但是 IIRC 不会在每次插入/删除时调整大小,但以某种方式避免过多的调整大小,即新实例。 (每次插入时它的大小加倍,需要比可用空间更多的空间或类似的东西......)
-
你能解释一下为什么你不想分配内存吗?
标签: c# .net arrays garbage-collection xna