我正在尝试创建一个对象池框架。每次客户端请求某种类型的对象时,我都会从缓存(队列)返回一个对象,或者如果缓存中没有任何对象,则创建一个新对象。
现在,当客户端代码完成对象时,将其传递给要再次缓存的框架。但是要使此模式起作用,需要将对象重置为初始状态。每个字段都必须设置为default(T)
。为每个课程手动执行此操作将容易出错并且工作繁琐。
public void Reset(){
x=0;
y=0;
...
}
当然,性能是主要关注点。我正在寻找最有效的解决方案。
修改
至于动机,这是一个unity3d游戏项目,垃圾收集是团结的一个大问题。从垃圾收集中保存的每个字节都很重要。因此,与仅创建新对象的最快,最简单,更合理的方式相比,需要缓存对象。
答案 0 :(得分:1)
这个想法是让你的池要求所有池化对象都是IPoolObject。该接口将包含Reset方法。
然后,只要调用弹出项目,就会从池框架中调用此Reset方法。如果没有任何喊叫,该方法仍然是空的。
这样,任何给定的池对象都可以以自己的方式重置,也可以重置附加到对象的其他组件。
您可以在那里找到我的泳池对象版本:https://github.com/fafase/unity-utilities/blob/master/Scripts/ObjectPool.cs
答案 1 :(得分:0)
这样的事情怎么样?
public void Reset()
{
foreach(FieldInfo fieldInfo in this.GetType().GetFields())
fieldInfo.SetValue(default(fieldInfo.GetType());
}