美文网首页
写的一个非常好用的对象池

写的一个非常好用的对象池

作者: 小蜻蜓队长 | 来源:发表于2019-12-20 20:11 被阅读0次

在游戏中总是有很多资源时可以复用的,当需要的时候从不活跃的池中取放入活跃池,当不需要的时候从活跃池转移到非活跃池.

using System;
using System.Collections.Generic;

public class ClassPool<T> where T : class
{
    protected List<T> m_ActionPool = new List<T>(); //活跃的池
    protected List<T> m_DealPool = new List<T>(); //不活跃的池

    //创建对象 或者从不活跃的池里pop,加入活跃的尺,如果不活跃的尺子里没有就创建一个
    public T Spaw(params object[] param)
    {
        T cls;
        if (m_DealPool.Count > 0)
        {
            cls = m_DealPool[0];
            m_DealPool.RemoveAt(0);
            if (cls == null)
            {
                cls = (T)Activator.CreateInstance(typeof(T), param);
            }
        }
        else
        {
            cls = (T)Activator.CreateInstance(typeof(T), param);
        }
        m_ActionPool.Add(cls);
        return cls;
    }

    //只需要pop如果不活跃的池子里没有就返回空
    public T SpawNotCreate()
    {
        T cls = null;
        if (m_DealPool.Count > 0)
        {
            cls = m_DealPool[0];
            m_DealPool.RemoveAt(0);
        }
        return cls;
    }

    //放入不活跃的池子
    public bool Recycle(T obj)
    {

        if (obj == null)
            return false;
        if (m_ActionPool.Contains(obj))
        {
            m_ActionPool.Remove(obj);
            m_DealPool.Add(obj);
            return true;
        }
        return false;
    }

    //遍历活动列表
    public void ActionTraverse(Action<T> action)
    {
        if(action == null)
            return;
        for (int i = m_ActionPool.Count-1; i >=0; i--)
        {
            if(m_ActionPool[i] != null)
                action(m_ActionPool[i]);
        }
    }

    //遍历非活动列表
    public void DealTraverse(Action<T> action)
    {
        if (action == null)
            return;
        for (int i = m_DealPool.Count-1; i >=0; i--)
        {
            if (m_DealPool[i] != null)
                action(m_DealPool[i]);
        }
    }

    //所有活跃全部转移到非活跃列表
    public void AllActionToDeal()
    {
        ActionTraverse((x) => { Recycle(x); });
    }

    //遍历所有列表完成你需要的操作
    public void AllTraverse(Action<T> action)
    {
        ActionTraverse(action);
        DealTraverse(action);
    }
}

以下是使用方式

using System;

namespace 对象池
{
    class Monster
    {
        public int data;
        private object monsterBt;

        public void OnDestroy()
        {
            data = 0;
        }

        public void Print()
        {
            Console.WriteLine("执行");
        }

    }

    class Program
    {
        static ClassPool<Monster> m_monsterPool = new ClassPool<Monster>();
        static void Main(string[] args)
        {
            //创建或者推出一个 对象
            Monster mster = m_monsterPool.Spaw();
            mster.data = 100;

            //遍历活跃表中的对象
            m_monsterPool.ActionTraverse((x) =>
            {
                x.Print();
            });

            //放入非活跃列表
            mster.OnDestroy();
            m_monsterPool.Recycle(mster);

            //遍历非活跃列表
            m_monsterPool.DealTraverse((x) => {
                x.Print();
            });

            //将对象池全部活跃列表转入非活跃列表
            m_monsterPool.AllActionToDeal();

        }
    }
}

相关文章

  • 写的一个非常好用的对象池

    在游戏中总是有很多资源时可以复用的,当需要的时候从不活跃的池中取放入活跃池,当不需要的时候从活跃池转移到非活跃池....

  • 深度剖析 C++ 对象池自动回收技术实现

    对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效。对象池通过对象复用的方式来...

  • unity中的内存管理之对象池的使用

    一、对象池的概念 对象池背后的理念其实是非常简单的。我们将对象存储在一个池子中,当需要时在再次使用,而不是每次都实...

  • Netty对象池实现分析

    什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的...

  • GenericObjectPool对象池实战

    通常一个对象创建/销毁的时候非常耗时,我们不会频繁的创建销毁它,而是考虑复用。复用对象的一种做法就是对象池,将创建...

  • SpringBoot-整合HikariCP连接池

    HikariCP连接池概述 池化思想 池化思想是我们项目开发过程中的一种非常重要的思想,如整数池,字符串池,对象池...

  • notify和notifyAll

    首先对象有一个monitor对象,monitor对象里有一个锁池和等待池某个线程调用了对象的wait方法以后,该线...

  • 04. PS2019CC官方教程四 —— 使用图层蒙版向图像中添

    1. 使用图层蒙板向图像中添加对象 蒙版图层是一个非常好用的技巧,可通过隐藏对象周围的区域将对象添加到图像中。 ...

  • kotlin版对象复用池

    项目中经常用到对象池复用,但是不一样的对象对应的复用池都不统一。想着能否有一个对象池,可以不用关心对象是啥,实现对...

  • Unity--简单的对象池

    简单的对象池分三步走: 建立对象池 拿到对象 回收对象 Test为对象池,Obj为自动回收的物体 Test.cs ...

网友评论

      本文标题:写的一个非常好用的对象池

      本文链接:https://www.haomeiwen.com/subject/anoinctx.html