设计模式-对象池技术
对象池
顾名思义,对象池是存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。一类对象池存放一类特定的对象。那么对象池有什么用呢?在游戏中,经常会有产生/销毁大量同类游戏对象的需求,比如游戏中源源不断的敌人、频繁刷新的宝箱、乃至一些游戏特效(风、雨等)。如果没有一种比较好的机制来管理这些对象的产生和销毁,而是一昧的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;}}
}
设计模式-对象池技术相关推荐
- java对象工厂池_[转载]Java对象池技术的原理及其实现
作者:汪永好 出处:计算机与信息技术 责任编辑: 方舟 [ 2006-11-25 07:00 ] 摘 要 :本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术 ...
- java 对象池 博客_Java对象池技术的原理及其实现的小结
一起学习 Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 T2 T3.其中T1表示对象的创建时间,T2表示对象的 ...
- java 对象池 实现_Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- 面试官问:对象池技术了解吗?apache common pool2呢?
欢迎关注方志朋的博客,回复"666"获面试宝典 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是 ...
- Unity中的资源管理-对象池技术(3)
本文分享Unity中的资源管理-对象池技术(3) 在上两篇文章中, 我们一起学习了普通类的两种对象池实现, 今天接着介绍Unity中GameObject(主要是预制实例化对象)的对象池. GameOb ...
- Unity对象池技术
Unity对象池技术 https://blog.csdn.net/LemonXQ/article/details/77148886 顾名思义,对象池是存放对象的缓冲区.用户可以从缓冲区中放入/取出对象 ...
- U3D客户端框架之类对象池技术优化C#语言GC
一.类对象池概念 1.类对象池介绍 类对象池,类似对象池,顾名思义就是一定数量的已经创建好的类对象(Object)的集合.当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对 ...
- 从入门到掉坑:Go 内存池/对象池技术介绍
作者:deryzhou,腾讯 PCG 后台开发工程师 Go 中怎么实现内存池,直接用 map 可以吗?常用库里 GroupCache.BigCache 的内存池又是怎么实现的?有没有坑?对象池又是什么 ...
- Netty对象池技术Recycler解析
文章目录 1. Recycler是什么? 2. 源码分析 2.1 Stack 2.2 Handle 2.3 WeakOrderQueue 2.4 get获取流程 2.5 recycle 回收流程 3. ...
最新文章
- 【任务脚本】双十一将至,任务脚本预热,OrangeJs基于autojs全自动程序,向大神致敬...
- Yii2 restful 分页支持
- java基础---try后小括号(1.7后IO流的关闭方式)
- 回旋矩形C语言,C语言程序设计100例之(27):回旋方阵
- 极度推荐的文章和网站
- shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?
- 在 里面_适合县城里面加盟的鞋店推荐
- 怎么用python画sin函数图像_用python画三角函数
- 谈一谈机器学习的基本原理
- 融资1个亿,5000万给魔窗,凭啥?
- 软件架构设计-大型网站技术架构于业务架构融合之道——部分知识点总结【未完】
- Agent with Warm Start and Active Termination for Plane Localization in 3DUltrasound基于强化学习的超声标准切面
- ZOOM——C++软件开发岗(实习)——视频面试一面
- 五款经典GPRS无线上网卡比拼
- 拼多多商品详情,产品竞价,关键词搜索接口
- Centos7编译安装Xen环境(vtpm)
- HTC 8X电信版连接WIN7电脑的真正解决办法
- 弗洛伊德算法(求最短路径)
- 常见Linux发行版
- 鸿蒙支持哪10款机型,鸿蒙2.0支持哪些手机 鸿蒙2.0支持机型列表大全