对象池

顾名思义,对象池是存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。一类对象池存放一类特定的对象。那么对象池有什么用呢?在游戏中,经常会有产生/销毁大量同类游戏对象的需求,比如游戏中源源不断的敌人、频繁刷新的宝箱、乃至一些游戏特效(风、雨等)。如果没有一种比较好的机制来管理这些对象的产生和销毁,而是一昧的Instantiate和Destroy,将使你的游戏性能大大下降,甚至出现卡死、崩溃…
      简而言之,就是当需要使用一个对象的时候,直接从该类对象的对象池中取出(SetActive(true)),如果对象池中无可用对象,再进行Instantitate。而当不再需要该对象时,不直接进行Destroy,而是SetActive(false)并将其回收到对象池中。
      搜,这个时候对象池该上场了
(1)简易版
     这里我使用到的是字典键值对的方式进行存储、当然还有堆栈的方式。大家可以去其他博客进行参考

//==========================
// - FileName:      PrefabTool.cs
// - Created:       true.
// - CreateTime:    2020/02/27 22:49:01
// - Email:         1670328571@qq.com
// - Region:        China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PrefabTool
{//通过单例拿到对象池private static PrefabTool _ins;public static PrefabTool Getins(){if (_ins==null){_ins = new PrefabTool();}return _ins;}/// <summary>/// 1、加载预制件/// 2、把加载完成的预制件放在对象池/// 3、预制件不会删除,将预制件重用///</summary>//1、生成一个存储对象预制件的库,使用字典:键值对Dictionary<string, GameObject> prefadic = new Dictionary<string, GameObject>();//2、用一个泛型集合List存储所有的对象Dictionary<string, List<GameObject>> objDic = new Dictionary<string, List<GameObject>>();//加载预制件public GameObject LoadPre(string Path){//判断对象池中是否有对象if (!prefadic.ContainsKey(Path)){//如果没有对象就把对象加载到池子中GameObject preObj = Resources.Load<GameObject>(Path);//通过地址添加预制体prefadic.Add(Path, preObj);}//如果有的话就直接使用GameObject obj = prefadic[Path];//返回一个预制体对象return obj;}//用来存储预制体对象public GameObject GetInsObj(string Path){//如果没有根据键查找到对象的话if (!prefadic.ContainsKey(Path)){objDic.Add(Path, new List<GameObject>());}//将预制体的地址存到一个泛型集合中List<GameObject> insit = objDic[Path];//如果集合中没有元素if (insit.Count == 0) {//加载GameObject preobjObj = LoadPre(Path);insit.Add(GameObject.Instantiate<GameObject>(preobjObj));}GameObject game = insit[insit.Count - 1];//删除集合中的最后一个insit.Remove(game);//返回游戏对象return game;}//回收游戏对象public void Remove(string Path,GameObject obj){if (objDic.ContainsKey(Path)){objDic[Path].Add(obj);}else{Debug.Log("键值错误.....");}}
}

另外就是通过一个路径(静态类、使用const常量进行修饰)来进行存储:

//==========================
// - FileName:      PrefabConst.cs
// - Created:       true.
// - CreateTime:    2020/02/27 22:48:01
// - Email:         1670328571@qq.com
// - Region:        China WUHAN
// - Description:
//==========================
public static class PrefabConst
{//预制件路径public const string bullet = "**";
}

(2)使用堆栈就行制作对象池、升级版

//==========================
// - FileName:      ObjectPool.cs
// - Created:       true.
// - CreateTime:    2020/04/21 22:25:45
// - Email:         1670328571@qq.com
// - Region:        China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ObjectPool : MonoBehaviour
{//游戏物体对象池public Stack<GameObject> PoolStack;//激活游戏物体的列表public Stack<GameObject> ActiveList;public ObjectPool(){PoolStack = new Stack<GameObject>();ActiveList = new Stack<GameObject>();}private static ObjectPool _instance;public static ObjectPool Instance{get{if (_instance == null){_instance = new ObjectPool();}return _instance;}}//取得游戏物体public GameObject GetObj(string Path,Transform Parent){GameObject Go = null;//是否有游戏物体if (PoolStack.Count <= 0){//生成物体Go = Instantiate(Resources.Load("Prefabs/" + Path) as GameObject);Go.transform.position = Vector3.one;Go.transform.SetParent(Parent);}else{//弹出栈Go = PoolStack.Pop();//激活Go.SetActive(true);Go.transform.SetParent(Parent);}return Go;}//压栈、放回对象池public void PushMonster(GameObject Prefab){//禁用游戏物体Prefab.SetActive(false);//压栈PoolStack.Push(Prefab);}
}

Demo:

//==========================
// - FileName:      ObjectTest.cs
// - Created:       true.
// - CreateTime:    2020/04/21 22:29:20
// - Email:         1670328571@qq.com
// - Region:        China WUHAN
// - Description:
//==========================
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ObjectTest : MonoBehaviour
{public Transform Parent;private ObjectPool objectPool;public bool isPlay = true;private void Start(){objectPool = ObjectPool.Instance;ObjectPool.Instance.GetObj("Plane", Parent);}private void Update(){if (Input.GetKeyDown(KeyCode.A)){isPlay = true;//从池子中取得游戏物体GameObject go = objectPool.GetObj("Chump", Parent);go.transform.position = Vector3.one;//讲拿到的物体放到怪物列表中objectPool.ActiveList.Push(go);}else if (Input.GetKeyDown(KeyCode.D)){if (!isPlay){return;}//判断激活列表是否有元素if (objectPool.ActiveList.Count >= 0){objectPool.PushMonster(objectPool.ActiveList.Pop());}}else if (objectPool.ActiveList.Count == 0){isPlay = false;}}
}

设计模式-对象池技术相关推荐

  1. java对象工厂池_[转载]Java对象池技术的原理及其实现

    作者:汪永好 出处:计算机与信息技术 责任编辑: 方舟 [ 2006-11-25 07:00 ] 摘 要 :本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术 ...

  2. java 对象池 博客_Java对象池技术的原理及其实现的小结

    一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...

  3. java 对象池 实现_Java对象池技术的原理及其实现

    看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...

  4. 面试官问:对象池技术了解吗?apache common pool2呢?

    欢迎关注方志朋的博客,回复"666"获面试宝典 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是 ...

  5. Unity中的资源管理-对象池技术(3)

    本文分享Unity中的资源管理-对象池技术(3) 在上两篇文章中, 我们一起学习了普通类的两种对象池实现, 今天接着介绍Unity中GameObject(主要是预制实例化对象)的对象池. GameOb ...

  6. Unity对象池技术

    Unity对象池技术 https://blog.csdn.net/LemonXQ/article/details/77148886 顾名思义,对象池是存放对象的缓冲区.用户可以从缓冲区中放入/取出对象 ...

  7. U3D客户端框架之类对象池技术优化C#语言GC

    一.类对象池概念 1.类对象池介绍 类对象池,类似对象池,顾名思义就是一定数量的已经创建好的类对象(Object)的集合.当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对 ...

  8. 从入门到掉坑:Go 内存池/对象池技术介绍

    作者:deryzhou,腾讯 PCG 后台开发工程师 Go 中怎么实现内存池,直接用 map 可以吗?常用库里 GroupCache.BigCache 的内存池又是怎么实现的?有没有坑?对象池又是什么 ...

  9. Netty对象池技术Recycler解析

    文章目录 1. Recycler是什么? 2. 源码分析 2.1 Stack 2.2 Handle 2.3 WeakOrderQueue 2.4 get获取流程 2.5 recycle 回收流程 3. ...

最新文章

  1. 【任务脚本】双十一将至,任务脚本预热,OrangeJs基于autojs全自动程序,向大神致敬...
  2. Yii2 restful 分页支持
  3. java基础---try后小括号(1.7后IO流的关闭方式)
  4. 回旋矩形C语言,C语言程序设计100例之(27):回旋方阵
  5. 极度推荐的文章和网站
  6. shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?
  7. 在 里面_适合县城里面加盟的鞋店推荐
  8. 怎么用python画sin函数图像_用python画三角函数
  9. 谈一谈机器学习的基本原理
  10. 融资1个亿,5000万给魔窗,凭啥?
  11. 软件架构设计-大型网站技术架构于业务架构融合之道——部分知识点总结【未完】
  12. Agent with Warm Start and Active Termination for Plane Localization in 3DUltrasound基于强化学习的超声标准切面
  13. ZOOM——C++软件开发岗(实习)——视频面试一面
  14. 五款经典GPRS无线上网卡比拼
  15. 拼多多商品详情,产品竞价,关键词搜索接口
  16. Centos7编译安装Xen环境(vtpm)
  17. HTC 8X电信版连接WIN7电脑的真正解决办法
  18. 弗洛伊德算法(求最短路径)
  19. 常见Linux发行版
  20. 鸿蒙支持哪10款机型,鸿蒙2.0支持哪些手机 鸿蒙2.0支持机型列表大全

热门文章

  1. android qq字体大小设置快捷键,电脑端QQ怎么将字体选择设置为气泡模式
  2. MATLAB简单三维曲面的绘制
  3. 音频如何转换成mp3格式?详细步骤解析
  4. 21考研复试上机常见题型、技巧与方法
  5. 过滤与反冲洗实验原理实训操作QY-HJGC43
  6. PTA L1-058 6翻了 C++实现
  7. 2022美亚个人赛复盘
  8. 安卓手机上如何设置待办定时提醒?
  9. 逆傅里叶变IFFT原始信号恢复方法研究-附Matlab代码
  10. Python 高维数据降维聚类显示