GameObjectPool——Unity中的对象池

这里介绍一种对象池的写法。它的优点在于无论取出还是插入游戏物体都是常数量时间。

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//对象池
public class GameObjectPool : MonoSingleton<GameObjectPool>
{

    /// <summary>可能存放多个种类的对象,每个种类有多个对象 </summary>
    private Dictionary<string, LinkedList<GameObject>> Pool = new Dictionary<string, LinkedList<GameObject>>();
    private Dictionary<GameObject, LinkedListNode<GameObject>> ObjectDic = new Dictionary<GameObject, LinkedListNode<GameObject>>();
    /// <summary>增加物体进入池(按类别增加)</summary>
    public void Add(string key, GameObject go)
    {
        //1.如果key在容器中存在,则将go加入对应的列表
        //2.如果key在容器中不存在,是先创建一个列表,再加入
        if (!Pool.ContainsKey(key))
        {
            Pool.Add(key, new LinkedList<GameObject>());
        }
        LinkedListNode<GameObject> t = new LinkedListNode<GameObject>(go);
        Pool[key].AddLast(t);
        ObjectDic[go] = t;

    }

    /// <summary>销毁物体(将对象隐藏)</summary>
    public void MyDestory(string key, GameObject destoryGo)
    {
        //设置destoryGo隐藏
        ObjectDic[destoryGo].Value.SetActive(false);
        LinkedListNode<GameObject> temp = ObjectDic[destoryGo];
        Pool[key].Remove(temp);
        Pool[key].AddFirst(temp);
    }

    /// <summary>将对象归入池中<summary>
    public void MyDestory(string key, GameObject tempGo, float delay)
    {
        //开启一个协程
        StartCoroutine(DelayDestory(key, tempGo, delay));
    }

    /// <summary>延迟销毁</summary>
    private IEnumerator DelayDestory(string key, GameObject destoryGO, float delay)
    {
        //等待一个延迟的时间
        yield return new WaitForSeconds(delay);
        MyDestory(key, destoryGO);
    }

    /// <summary>创建一个游戏物体到场景 </summary>
    public GameObject CreateObject(string key, GameObject go, Vector3 position, Quaternion quaternion)
    {
        //先找是否有可用的,如果没有则创建,如果有找到后设置好位置,朝向再返回
        GameObject tempGo = Pool[key].First.Value;
        if (tempGo.activeSelf == false)
        {
            tempGo.transform.position = position;
            tempGo.transform.rotation = quaternion;
            tempGo.SetActive(true);
            Pool[key].RemoveFirst();
            Pool[key].AddLast(ObjectDic[tempGo]);
        }
        else
        {
            tempGo = GameObject.Instantiate(go, position, quaternion) as GameObject;
            Add(key, tempGo);
        }
        return tempGo;

    }

    /// <summary>清空某类游戏对象</summary>
    public void Clear(string key)
    {
        var t = Pool[key].First;
        while (t.Next!=null)
        {
            ObjectDic.Remove(t.Value);
        }
        Pool.Remove(key);

    }

    /// <summary>清空池中所有游戏对象</summary>
    public void ClearAll()
    {
        ObjectDic.Clear();
        Pool.Clear();
    }
}

  

  

时间: 2024-10-25 16:13:39

GameObjectPool——Unity中的对象池的相关文章

关于tomcat中Servlet对象池

Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端请求tomcat会使用多线程处理,所以应该保证此Servlet对象的线程安全,多个线程不管执行顺序如何都能保证执行结果的正确性.例如刚做web应用开发时可能会犯的一个错误:在某个Servlet中使用成员变量累加去统计访问次数,这就存在线程安全问题.

KBEngine中的对象池

编程中常常看到将许多东西放在资源池中,在使用的时候可以提高效率.看起来和实现一个缓存类型,虽然原理简单,但是徒手写有总觉得缺点什么,所以在此总结一下 1.对象池 template< typename T, typename THREADMUTEX = KBEngine::thread::ThreadMutexNull > class ObjectPool { public: typedef std::list<T*> OBJECTS; ObjectPool(std::string

对象池的设计

对象池的设计及其实现 对象池概述: 对象池模型创建并拥有固定数量的对象,当程序需要一个新的对象时,如果对象池中有空闲对象,则立即返回,否则才创建新的该类对象.当一个对象不再被使用时,其应该应该将其放回对象池,以便后来的程序使用.由于系统资源有限,一个对象池模型应该指定其可容纳的最大对象数量.当达到该数量时,如果仍然有对象创建请求,则抛出异常或者阻塞当前调用线程,直到一个对象被放回对象池中. 对象池模型适用的场景: (1)需要使用大量对象 (2)这些对象的实例化开销比较大且生存期比较短 对象池优势

对象池的设计及其实现

对象池概述: 对象池模型创建并拥有固定数量的对象,当程序需要一个新的对象时,如果对象池中有空闲对象,则立即返回,否则才创建新的该类对象.当一个对象不再被使用时,其应该应该将其放回对象池,以便后来的程序使用.由于系统资源有限,一个对象池模型应该指定其可容纳的最大对象数量.当达到该数量时,如果仍然有对象创建请求,则抛出异常或者阻塞当前调用线程,直到一个对象被放回对象池中. 对象池模型适用的场景: (1)需要使用大量对象 (2)这些对象的实例化开销比较大且生存期比较短 对象池优势: 一个对象池可以在可

Unity3D 基于预设(Prefab)的泛型对象池实现

背景 在研究Inventory Pro插件的时候,发现老外实现的一个泛型对象池,觉得设计的小巧实用,不敢私藏,特此共享出来. 以前也看过很多博友关于对象池的总结分享,但是世界这么大,这么复杂到底什么样的对象池才是好的呢,我们发现通用的对象池未必适应所有的环境,比如基于UI的局部(从某个Scene,到某个Dialog)对象池,范围不同,需要的对象池就有不同的要求.本文就是介绍一种基于预设(Prefab)的局部UI对象池. 通用信息提示窗口的实现http://www.manew.com/thread

什么是对象池

COM+ 对象池服务可以减少从头创建每个对象的系统开销. 在激活对象时,它从池中提取.在停用对象时,它放回池中,等待下一个请求. 对象池使您能够控制所使用的连接数量,与连接池相反,连接池用来控制达到的最大数量.下面是对象池和连接池之间的重要区别: 创建 使用连接池时,创建在同一线程上进行,因此如果池中没有连接,则代表您创建连接.采用对象池时,池可以决定创建新对象.但是,如果已经达到最大数量,它会给您下一个可用的对象.当需要花费较长时间来创建对象时,这的确是一个重要的行为.但不要长期使用这种方法来

Unity中对象池的使用

unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在一定程度上减少频繁创建对象所造成的开销. 并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销.对生成时开销不大的对象进行池化,反而可能会出现“维护对象池的开销”大于“生成新对象的开销”,从而使性能降低的情况. GameObjectPool.cs如下 using UnityEngine; u

Unity ----- 对象池GameObjectPool

孙广东 2014.6.28 很早之前看到的外国文章,觉得不错,分享一下, 对象池在AssetStore中也是有很多插件的,但是有些重了,自己写一个轻量的岂不是很好. 当你需要创建大量某种类型对象时,它可以方便地重新使用单个对象,而不是不断地 创建/销毁(操作会导致大量的垃圾回收).此ObjectPool脚本,生成和回收您的游戏对象的对象池.代码:https://github.com/UnityPatterns/ObjectPoolhttp://unitypatterns.com/resource

Unity3D中对象池的实现

在Unity中常常会遇到需要重复创建,销毁某些物体的情况,比如fps类游戏中的子弹,rpg类游戏中的小怪等等,如果直接使用Instantiate和Destroy的话,会浪费系统的资源,而使用对象池则能够节省下这些浪费. 这里使用一个重复利用子弹的进行发射的简单场景来演示对象池. 首先需要一个在场景中创建一个Cube,充当子弹. 然后在Assets目录下创建Resources文件夹,在Cube上添加上刚体,取消重力后,将Cube拖入Resources文件夹内作为一个预设,在场景中删除这个Cube.