2

我正在尝试创建一个对象池框架。每次客户端请求某种类型的对象时,我都会从缓存(队列)中返回一个对象,或者如果缓存中没有对象,则创建一个新对象。

现在,当客户端代码处理完对象后,将其传递给框架以再次缓存。但是要使这种模式起作用,需要将对象重置为初始状态。每个字段都必须设置为其default(T). 为每个班级手动执行此操作将是容易出错且乏味的工作。

public void Reset(){
  x=0;
  y=0;
  ...
}

当然,性能是首要考虑的问题。我正在寻找最有效的解决方案。

编辑:

至于动机,这是一个unity3d游戏项目,垃圾收集是unity中的一个大问题。您从垃圾收集中保存的每个字节都很重要。因此,与创建新对象的最快、最简单、更合理的方式相比,缓存对象是可取的。

4

2 回答 2

1

这个想法是让您的池要求所有池对象都是 IPoolObject。此接口将包含 Reset 方法。

然后,每当调用弹出项目时,都会从池框架中调用此 Reset 方法。如果什么都不做,该方法将保持为空。

这样,任何给定的池对象都可以以自己的方式重置,并且还可以重置附加到该对象的其他组件。

您可以在那里找到我的池对象版本:https ://github.com/fafase/unity-utilities/blob/master/Scripts/ObjectPool.cs

于 2015-12-26T10:45:47.017 回答
0

这样的事情呢?

public void Reset()
{
    foreach(FieldInfo fieldInfo in this.GetType().GetFields())
        fieldInfo.SetValue(default(fieldInfo.GetType());
}
于 2015-12-26T03:45:06.453 回答