一段泛型动态对象池的定义

这个对象池的定义来源于unity  asset store  中的HTC VIVE INPUT插件

泛型动态对象池。
此对象池保存对象的容器是一个泛型栈。这个栈中保存的是没被使用的对象,当外界需要一个新对象时,就从此栈中弹出一个对象以供使用。当对象使用完毕后,此对象将会被压入栈。 对象池还有三个委托类型的变量,分别用于新建一个对象、获取一个对象和释放一个对象。新建一个泛型对象池时需要给构造函数传入这三个变量的值。以unity中的一个简单的生成子弹为例:当玩家按下发射键需要显示出一个子弹时,需要调用获取一个对象这个委托,此处即是本对象池中的 Get方法,此方法先检查栈中是否有未使用的对象实例,有则弹出栈顶对象,无则新建一个对象并压入栈。当获取到一个子弹后,可能需要对这个子弹实例进行一些处理,比如初始化位置、激活它等,这就可以用actionOnGet来执行。当使用玩对象后需要销毁,比如子弹过一段时间后消失,那么  就把这个子弹实例的使用权释放掉,让子弹消失时可能需要执行一些操作,比如爆炸、隐藏等操作,就需要调用Release方法,该方法调用actionOnRelease来执行具体的操作。

namespace HTC.UnityPlugin.Utility
{
    public class ObjectPool<T>
    {
        private readonly Stack<T> stack = new Stack<T>();
        private readonly Func<T> actionOnNew;
        private readonly UnityAction<T> actionOnGet;
        private readonly UnityAction<T> actionOnRelease;


        public int CountAll { get; private set; }
        public int CountInactive { get { return stack.Count; } }
        public int CountActive { get { return CountAll - CountInactive; } }


        public ObjectPool(Func<T> onNew, UnityAction<T> onGet = null, UnityAction<T> onRelease = null)
        {
            actionOnNew = onNew;
            actionOnGet = onGet;
            actionOnRelease = onRelease;
        }
        //从对象池中获取一个对象实例
        public T Get()
        {
            T element;
            if (stack.Count == 0)
            {
                element = actionOnNew == null ? default(T) : actionOnNew.Invoke();
                CountAll++;
            }
            else
            {
                element = stack.Pop();
            }


            if (actionOnGet != null) { actionOnGet.Invoke(element); }
            return element;
        }


        public void Release(T element)
        {
            if (stack.Count > 0 && ReferenceEquals(stack.Peek(), element))
            {
                Debug.LogError("Internal error. Trying to destroy object that is already released to pool.");
            }


            if (actionOnRelease != null) { actionOnRelease.Invoke(element); }


            stack.Push(element);


            if (stack.Count > CountAll)
            {
                CountAll = stack.Count;
            }
        }
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值