什么是对象池?
对象池是指在软件初始化阶段,取出一块完整的内存,用来生成运行过程中需要用到的对象,当我们需要这个对象时,不是去new一个新的对象,而是从对象池中取出这个对象来使用,用完之后,再将对象返回到对象池中。
图片以及代码出自b站up主阿严的教程
使用对象池的好处
可以显著的提升性能
C#队列https://segmentfault.com/a/1190000039729726
碎碎念
写有返回值的函数的时候可以先生成一个临时的变量,然后在函数的最后把返回值返回到临时变量上。
代码:
[SerializeField] GameObject prefab;
[SerializeField] int size;
public int Size
{
get
{
return size;
}
}
int runTimeSize;
public int RunTimeSize
{
get
{
return queue.Count;
}
}
Transform parent;
public GameObject Prefab
{ get
{
return prefab;
}
}
Queue<GameObject> queue;
public void Initlize(Transform parent)
{
queue = new Queue<GameObject>();
for (int i = 0; i < size; i++)
{
this.parent = parent;
queue.Enqueue(Copy());
}
}
GameObject Copy()
{
var copy = GameObject.Instantiate(prefab,parent);
copy.SetActive(false);
return copy;
}
GameObject AvailableGameobject()
{
GameObject availableGameobject = null;
if (queue.Count>0&&!queue.Peek().activeSelf)//为了防止刚出列便入列的对象会在入列的时候处于激活的状态,所以要限制一下代码,当对象是失活状态时才可以让它入列
{
availableGameobject= queue.Dequeue();
}
else
{
availableGameobject = Copy();
}
queue.Enqueue(availableGameobject);
return availableGameobject;
}
public GameObject PreparedGameobject()
{
GameObject preparedGameobject = AvailableGameobject();
preparedGameobject.SetActive(true);
return preparedGameobject;
}
GameObject AvailableGameobject()
{
GameObject availableGameobject = null;
if (queue.Count>0&&!queue.Peek().activeSelf)
{
availableGameobject= queue.Dequeue();
}
else
{
availableGameobject = Copy();
}
queue.Enqueue(availableGameobject);//出列后立刻入列
return availableGameobject;
}