【发布时间】:2019-05-10 16:32:11
【问题描述】:
所以我正在尝试使用队列来创建对象池以回收它们。在实现它之后,我似乎仍然获得相同级别的内存使用。我很难理解使用 queue() 或 dequeue() 是否是通过引用或值传递。
void ClearNodeListandBackupToPool(ref List<Node> nodelist)
{
foreach (var node in nodelist)
{
nodePool.Enqueue(node);
}
nodelist.Clear();
}
Node CreateNewNode(Vector2 tile, Node parent, double gCost, double hCost)
{
if (nodePool.Count > 0)
return nodePool.Dequeue().init(tile, parent, gCost, hCost);
return new Node(tile,parent,gCost,hCost);
}
我预计这种方法的内存使用率会很低或没有,但它保持不变。感谢您的帮助! :)
【问题讨论】:
-
对于引用类型,引用是按值传递的。使用值类型,传递值。
ref List<Node> nodelist将引用传递给引用,但这无关紧要,因为您从未在方法中分配给nodelist。ref在该代码中什么也不做。 “同级别垃圾”是什么意思?你能解释一下输入是什么,期望的输出是什么,以及实际输出是什么? -
什么是
return nodePool.Dequeue().init(tile, parent, gCost, hCost);?这样做的目的是什么?init()是做什么的,为什么要在从队列中取出的项目上调用它? -
List.Clear() 不会将容量重置为 0,容量保持不变,因此如果 GC 不收集它,它可能会保持为垃圾。
-
@michaelmena 当您提到“垃圾级别”时,您指的是内存使用情况吗?
-
@EdPlunkett 对不起,我的意思是当垃圾收集(GC)启动时,它会删除很多对象(节点)。据我了解,GC 会在没有引用对象时从内存中删除对象,但如果我认为它们应该有引用,因为我将它们“存储”到队列中。