【Unity程序小技巧】如何消除多次Destory带来的性能消耗

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 收录于专栏:Unity基础实战

🅰️



文章目录

    • 🅰️
    • 前言
    • 🎶(==1==) 使用简单的List显隐功能
    • 🎶(==2==) 升级——使用缓存池小框架
    • 🅰️


前言


🎶(1 使用简单的List显隐功能


1.先全部把资源资源存储到List中,并让其失活

在这里插入图片描述

2.然后添加一个显隐方法,需要的时候显示,不需要的时候隐藏

在这里插入图片描述

/// <summary>/// 动态加载左侧Item/// </summary>public void AotuLoadLeftItem(){int num = ServerLists.Count / 5 + 1; //分成多少个区服集按钮Itemfor (int i = 1; i <= num; i++){//加载预制体GameObject leftItem = Instantiate(Resources.Load<GameObject>("UI/UIItem/leftItem1"));leftItem.transform.SetParent(LeftServe.content); //固定其父对象LeftItemData serverData = leftItem.GetComponent<LeftItemData>();//设置每个Item显示的区间范围int star, end;star  = (i-1) * 5 + 1;end = i  * 5;          if (i * 5 >= ServerLists.Count ){end = ServerLists.Count;}         serverData.ChangeTextShow(star, end );  //更新显示的区间范围文本Button leftItemButton = leftItem.GetComponent<Button>(); //给按钮添加监听,点击后更新右边的区服//  AotuLoadRightItem(star, end);  //更新对应的区间服务器集AotuLoadRightItem(star, end);//按下才可以激活leftItemButton.onClick.AddListener(() =>{ActiveTrue(star, end);});}}/// <summary>/// 动态加载右侧Item/// </summary>/// <param name="start"></param>/// <param name="end"></param>public void AotuLoadRightItem(int start ,int end){for (int i = start; i <= end; i++){GameObject rightItem = Instantiate(Resources.Load<GameObject>("UI/UIItem/ChooseItem1"));          rightItem.transform.SetParent(RightServe.content,false); //固定其父对象// rightItem.transform.localScale = Vector3.one;ChooseItemData serverData = rightItem.GetComponent<ChooseItemData>();serverData.UpdataItemInfo(ServerLists[i-1]); //更新服务器数据serverData.gameObject.SetActive(false);//先全部失活rightItemList.Add(rightItem);//然后存储到List列表中}}/// <summary>/// 激活,(好处减少了Destory的性能消耗)/// </summary>/// <param name="start"></param>/// <param name="end"></param>public void  ActiveTrue(int start, int end){for (int i = start; i <= end; i++){rightItemList[i - 1].SetActive(true);}}

🎶(2 升级——使用缓存池小框架


在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;// 抽屉数据  public class PoolData
{public GameObject fatherObj;public List<GameObject> poolList;public PoolData(GameObject obj, GameObject poolObj){fatherObj = new GameObject(obj.name);fatherObj.transform.parent = poolObj.transform;poolList = new List<GameObject>() {};PushObj(obj);}//存public void PushObj(GameObject obj){obj.SetActive(false);poolList.Add(obj);obj.transform.parent = fatherObj.transform;}//取public GameObject GetObj(){GameObject obj = null;       obj = poolList[0];     //取第一个poolList.RemoveAt(0);  //然后容器中移除obj.SetActive(true);obj.transform.parent = null;     //断开了父子关系return obj;}
}//缓存池管理器
public class PoolManager : SingleManager<PoolManager>
{//存储衣柜public Dictionary<string, PoolData> poolDic = new Dictionary<string, PoolData>();private GameObject poolObj;//衣柜里面拿东西public void GetObj(string name, UnityAction<GameObject> callBack){//有抽屉 并且抽屉里有东西if (poolDic.ContainsKey(name) && poolDic[name].poolList.Count > 0){callBack(poolDic[name].GetObj());}else{//通过异步加载资源 创建对象给外部用ResourceManager .GetInstance().LoadAsync<GameObject>(name, (obj2) =>{obj2.name = name;callBack(obj2); //异步加载出的资源不能直接给外部使用所以需要委托});}}//放东西进衣柜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));}}//清空缓存池——在场景切换时public void Clear(){poolDic.Clear();poolObj = null;}
}

🅰️


⭐【Unityc#专题篇】之c#进阶篇】

⭐【Unityc#专题篇】之c#核心篇】

⭐【Unityc#专题篇】之c#基础篇】

⭐【Unity-c#专题篇】之c#入门篇】

【Unityc#专题篇】—进阶章题单实践练习

⭐【Unityc#专题篇】—基础章题单实践练习

【Unityc#专题篇】—核心章题单实践练习


你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/168144.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨镜头目标融合__追踪之目标重识别研究(跨镜头目标追踪)

文章目录 标题&#xff1a;跨镜头目标融合&#xff1b;目标重识别&#xff1b;跨镜头目标追踪&#xff1b; 1 目的&#xff1a;2 实现方法/策略&#xff1a;2.1 目标类型位置匹配&#xff08;或考虑结合目标轨迹&#xff09;2.2 目标重识别2.3 目标类型位置匹配(轨迹)目标重识别…

PowerPoint to HTML5 SDK Crack

Convert PowerPoint to HTML5 Retaining Animations, Transitions, Hyperlinks, Smartart, Triggers and other multimedia effects World’s first and industry best technology for building web/mobile based interactive presentations directly from PowerPoint – that …

2022最新版-李宏毅机器学习深度学习课程-P50 BERT的预训练和微调

模型输入无标签文本&#xff08;Text without annotation&#xff09;&#xff0c;通过消耗大量计算资源预训练&#xff08;Pre-train&#xff09;得到一个可以读懂文本的模型&#xff0c;在遇到有监督的任务是微调&#xff08;Fine-tune&#xff09;即可。 最具代表性是BERT&…

YOLOv8模型ONNX格式INT8量化轻松搞定

ONNX格式模型量化 深度学习模型量化支持深度学习模型部署框架支持的一种轻量化模型与加速模型推理的一种常用手段&#xff0c;ONNXRUNTIME支持模型的简化、量化等脚本操作&#xff0c;简单易学&#xff0c;非常实用。 ONNX 模型量化常见的量化方法有三种&#xff1a;动态量化…

Centos配置邮件发送

在CentOS Linux上配置邮件发送 在这个指南中&#xff0c;我们将讨论如何配置CentOS Linux系统以通过外部邮件服务器发送电子邮件&#xff0c;使用自己的邮件账户进行发送。 第一步&#xff1a;开启SMTP授权码 首先&#xff0c;我们以QQ邮箱为例&#xff0c;需要开启SMTP授权…

C#开发的OpenRA游戏之世界存在的属性CombatDebugOverlay(3)

C#开发的OpenRA游戏之世界存在的属性CombatDebugOverlay(3) 这次来分析CombatDebugOverlay属性,这个属性只有在调试游戏的时候才会使用。当你设置这个属性的时候,就可以看到如下图的结果: 可以看到物品的周边都有一个圆圈,以及有一些十字的点位标志。 那些十字表示的点…

ArcGIS进阶:水源涵养功能分级评价操作

首先抛出水源涵养重要性评价的公式&#xff1a;水源涵养量降雨量-蒸散发量-地表径流量&#xff0c;其中地表径流量降雨量*平均地表径流系数 声明&#xff1a;以下数据来源于来自于牛强老师书籍&#xff08;城乡规划GIS技术&#xff09;。 以下给出重要性评价阈值表&#xff1…

视频剪辑助手:轻松实现视频随机分割并提取音频保存

随着社交媒体和视频平台的日益普及&#xff0c;视频制作和分享已成为人们日常生活的一部分。无论是分享个人生活&#xff0c;还是展示才艺&#xff0c;或是推广产品&#xff0c;视频都是一个非常有效的工具。但是&#xff0c;视频制作往往涉及到大量的视频剪辑工作&#xff0c;…

【CodeTop】TOP 100 刷题 1-10

文章目录 1. 无重复字符的最长子串题目描述代码与思路 2. 反转链表题目描述代码与解题思路 3. LRU 缓存题目描述代码与解题思路 4. 数组中的第K个最大元素题目描述代码与解题思路 5. K 个一组翻转链表题目描述代码与解题思路 6. 三数之和题目描述代码与解题思路 7. 最大子数组和…

2023年成为优秀自动化测试工程师的 7 个步骤!

“测试自动化测试工程师可以将你从充满代码的世界中拯救出来。”企业完全同意这一说法&#xff0c;这就是您在自动化测试行业中看到大量就业机会的原因。我在 Quora 上收到了很多与自动化测试中的职业选择相关的答案请求&#xff0c;以及人们如何在有或没有手动测试经验的情况下…

Visual Studio 2019下编译OpenCV 4.7 与OpenCV 4.7 contrib

一、环境 使用的环境是Win10,Visual Studio 2019,Cmake3.28,cdua 11.7&#xff0c;cudnn 8.5,如果只是在CPU环境下使用&#xff0c;则不用安装CUDA。要使用GPU处理&#xff0c;安装好CUDA之后&#xff0c;要测试安装的CUDA是否能用。不能正常使用的话&#xff0c;添加一下系统…

机器学习---多分类SVM、支持向量机分类

1. 多分类SVM 1.1 基本思想 Grammer-singer多分类支持向量机的出发点是直接用超平面把样本空间划分成M个区域&#xff0c;其 中每个区域对应一个类别的输入。如下例&#xff0c;用从原点出发的M条射线把平面分成M个区域&#xff0c;下图画 出了M3的情形&#xff1a; 1.2 问题…