UGUI中的obejectpool<T>以及listpool<T>

这篇博客介绍了Unity UGUI系统下如何利用泛型实现对象池优化内存管理。对象池通过Stack进行内部实现,提供获取和释放对象的接口,并在操作时调用预设的回调函数。同时,展示了针对List<T>类型的专用对象池类,用于减少频繁创建和销毁List实例导致的开销。通过对象池,可以有效地减少内存碎片和提高游戏性能。
摘要由CSDN通过智能技术生成

UGUI源码中的对象池类源码(objectpool)

//T 泛型,传入的类型,可以是任意类型(但必须满足泛型约束:new()),T是对象池管理的类型
internal class ObjectPool<T> where T : new()
    {
       //用一个栈来进行内部实现
        private readonly Stack<T> m_Stack = new Stack<T>();
        //向对象池里取T类型的元素的时候的回调
        private readonly UnityAction<T> m_ActionOnGet;
        //向对象池里放T类型元素的时候回调,两个回调都在该类构造的时候初始化
        private readonly UnityAction<T> m_ActionOnRelease;
       //当前再用以及池里面放到所有T类型的元素的和
        public int countAll { get; private set; }
        //从池里面取出,当前在用的元素个数
        public int countActive { get { return countAll - countInactive; } }
        //池中的T类型元素个数
        public int countInactive { get { return m_Stack.Count; } }
     
        public ObjectPool(UnityAction<T> actionOnGet, UnityAction<T> actionOnRelease)
        {
            m_ActionOnGet = actionOnGet;
            m_ActionOnRelease = actionOnRelease;
        }
       //从对象池里往外取
        public T Get()
        {
            T element;
            //池里面没有,实例化一个
            if (m_Stack.Count == 0)
            {
                element = new T();
                countAll++;
            }
            //有,直接把池里这个拿出去
            else
            {
                element = m_Stack.Pop();
            }
            //取出这个T类型元素时的回调,执行该回调
            if (m_ActionOnGet != null)
                m_ActionOnGet(element);
            return element;
        }
        

        public void Release(T element)
        {
            //该T类型的元素以及放进池中里了,报错
            if (m_Stack.Count > 0 && ReferenceEquals(m_Stack.Peek(), element))
                Debug.LogError("Internal error. Trying to destroy object that is already released to pool.");
            //放进池子时的回调
            if (m_ActionOnRelease != null)
                m_ActionOnRelease(element);
            m_Stack.Push(element);
        }
    }

UGUI中基于objectpool实现的listpool

internal static class ListPool<T>
    {
        // Object pool to avoid allocations.
        //池子里复用的元素类型是list<T>,t根据传入的泛型类型而定
        //往池子里放list<T>类型元素时的回调是clear,每次往池子里放list就清空list
        private static readonly ObjectPool<List<T>> s_ListPool = new ObjectPool<List<T>>(null, Clear);
        static void Clear(List<T> l) { l.Clear(); }

        public static List<T> Get()
        {
            return s_ListPool.Get();
        }

        public static void Release(List<T> toRelease)
        {
            s_ListPool.Release(toRelease);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值