温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ObjectPool的原理是什么

发布时间:2021-12-18 14:12:32 来源:亿速云 阅读:129 作者:iii 栏目:大数据

本篇内容主要讲解“ObjectPool的原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ObjectPool的原理是什么”吧!

ObjectPool是什么

通过对Unity的UI源码解析我们发现了一个对游戏性能优化相关的一个Object缓存池ObjectPool.cs

ObjectPool的原理是什么

为什么

在游戏中,我们需要创建和销毁3D模型,粒子特效,List,Array,包括战斗中由于频繁释放技能创建出来的子弹等物体,它们在频繁的销毁创建过程中会产生很多的碎片在内存中,如果没有一个统一的管理器来循环利用很容易造成游戏卡顿。因此ObjectPool就是用来对游戏中的Object对象进行对象池管理用的。

怎么做

下面我们来查看源码,看下其实现原理。

using System.Collections.Generic;
using UnityEngine.Events;

namespace UnityEngine.UI
{
   internal class ObjectPool<T> where T : new()
   {
       private readonly Stack<T> m_Stack = new Stack<T>();
       private readonly UnityAction<T> m_ActionOnGet;
       private readonly UnityAction<T> m_ActionOnRelease;

       public int countAll { get; private set; }
       public int countActive { get { return countAll - countInactive; } }
       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();
           }
           if (m_ActionOnGet != null)
               m_ActionOnGet(element);
           return element;
       }

       public void Release(T element)
       {
           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);
       }
   }
}

ObjectPool使用了一个Stack堆(last-in-first-out (LIFO))后进先出的结构,当我们需要新建(Get)一个新的Object的时候先从Stack的堆顶取出第一个,当使用结束的时候将其释放掉(Release),也就是将其重新放回Stack堆里面。原理其实很简单,当然里面增加了放进和放出时候的Action,可以用来传入回调函数,分别在取出和释放的时候调用。

到此,相信大家对“ObjectPool的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI