网站建设资讯

NEWS

网站建设资讯

ObjectPool的原理是什么

本篇内容主要讲解“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 where T : new()
   {
       private readonly Stack m_Stack = new Stack();
       private readonly UnityAction m_ActionOnGet;
       private readonly UnityAction 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 actionOnGet, UnityAction 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的原理是什么”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


名称栏目:ObjectPool的原理是什么
分享链接:http://njwzjz.com/article/gophsj.html