之前项目在使用对象的时候 就考虑到 如果频繁的创建对象或者销毁对象的话 对性能会有影响 所以就自己写了个对象池 代码比较简单 项目亲测实用 喜欢的朋友拿走吧
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//一个模板类,定义缓存的基本类
public class GCKiller<T> where T: new()
{
protected int maxCacheObjectNum = 20;
protected T[] cacheObjectList;
protected int listHead = 0;
protected int listTail = 0;
public GCKiller(int maxCacheObjectNum)
{
this.maxCacheObjectNum = maxCacheObjectNum;
cacheObjectList = new T[this.maxCacheObjectNum];
for(int index = 0; index < this.maxCacheObjectNum; ++index)
{
cacheObjectList[index] = default(T);
}
}
public virtual T GetUnusedOne()
{
{
listHead = listHead % maxCacheObjectNum;
listTail = listTail % maxCacheObjectNum;
while(listHead != listTail)
{
T current = cacheObjectList[listHead];
int tempHeaderIndex = listHead;
listHead = (listHead + 1) % maxCacheObjectNum;
if (current != null)
{
cacheObjectList[tempHeaderIndex] = default(T);
return current;
}
}
}
return new T();
}
public virtual bool ReleaseUnusedOne(T t)
{
if(t == null) return false;
listHead = listHead % maxCacheObjectNum;
int tempTail = (listTail + 1) % maxCacheObjectNum;
if(tempTail != listHead) //没有回收满
{
//repeat check
#if !DROP_LIST_POOL_REPEAT_CHECK
#if UNITY_EDITOR
int refhead = listHead % maxCacheObjectNum;
int refTail = listTail % maxCacheObjectNum;
while(refhead != refTail)
{
T refT = cacheObjectList[refhead];
if (object.Equals(refT, t))
{
DebugLog.LogInFileError("logic error, repeat ReleaseUnusedOne");
return false;
}
refhead = (refhead + 1) % maxCacheObjectNum;
}
#endif
#endif
listTail = listTail % maxCacheObjectNum;
cacheObjectList[listTail] = t;
listTail = tempTail;
return true;
}
return false;
}
public List<T> GetAllValidItems()
{
List<T> tempList = ListPool<T>.Claim();
listHead = listHead % maxCacheObjectNum;
listTail = listTail % maxCacheObjectNum;
while (listHead != listTail)
{
T current = cacheObjectList[listHead];
int tempHeaderIndex = listHead;
listHead = (listHead + 1) % maxCacheObjectNum;
if (current != null)
{
tempList.Add(current);
}
}
return tempList;
}
public virtual void Clean()
{
{
listHead = 0;
listTail = 0;
for (int index = 0; index < this.maxCacheObjectNum; ++index)
{
cacheObjectList[index] = default(T);
}
}
}
}
public class GameObjectGCKiller : GCKiller<GameObject>
{
protected GameObject template;
public GameObjectGCKiller(GameObject template, int maxCacheObjectNum): base(maxCacheObjectNum)
{
this.template = template;
if(this.template == null) DebugLog.LogError("GameObjectGCKiller template is null");
}
public override GameObject GetUnusedOne()
{
listHead = listHead % maxCacheObjectNum;
listTail = listTail % maxCacheObjectNum;
while(listHead != listTail)
{
GameObject current = cacheObjectList[listHead];
listHead = (listHead + 1) % maxCacheObjectNum;
if(current != null) return current;
}
if(template == null) return null;
return GameObject.Instantiate(template) as GameObject;
}
public override bool ReleaseUnusedOne(GameObject t)
{
if(t == null) return false;
listHead = listHead % maxCacheObjectNum;
int tempTail = (listTail + 1) % maxCacheObjectNum;
if(tempTail != listHead) //没有回收满
{
listTail = tempTail;
cacheObjectList[listTail] = t;
return true;
}
else
{
GameObject.DestroyObject(t);
}
return false;
}
public override void Clean()
{
listHead = listHead % maxCacheObjectNum;
listTail = listTail % maxCacheObjectNum;
while(listHead != listTail)
{
GameObject current = cacheObjectList[listHead];
listHead = (listHead + 1) % maxCacheObjectNum;
if(current != null) GameObject.DestroyObject(current);
}
base.Clean();
}
}