Unity中对象池的使用(用一个简单粗暴的例子)

问题描述:Unity在创建和销毁对象的时候是很消耗性能的,所以我们在销毁一个对象的时候,可以不用Destroy,而是将这个物体隐藏后放到回收池里面,当再次需要的时候如果回收池里面有之前回收的对象,就直接拿来用,这样就可以大量的创建和销毁物体。

首先创建一个子弹预制体,并添加刚体组件,然后创建一个Skill空对象和一个Skill脚本

using System.Collections;
using UnityEngine;public class Skill : MonoBehaviour
{public int _SkillLv;//技能等级public GameObject bluut;//子弹预制体[Header("可调节参数")]//速度合成public float _Speedy;public float _Speedx;public float  _cd;void Start(){StartCoroutine(FireCoroutine());}//定义一个携程,用于在一定时间后发射子弹//间隔为_cd秒IEnumerator FireCoroutine(){while (true){yield return new WaitForSeconds(_cd);fashe(_SkillLv);}}//发射子弹的方法void fashe(int lv){for (int i = 0; i < lv; i++){GameObject bullet = Instantiate(bluut, transform.position, Quaternion.identity);int randomY = Random.Range(200, (int)_Speedy);int randomX = Random.Range(-(int)_Speedx, (int)_Speedx);bullet.GetComponent<Rigidbody2D>().AddForce(new Vector2(randomX, randomY));Destroy(bullet, 5f);}}
}

 将Skill脚本加到Skill空对象上然后将子弹预制体拖入,然后运行游戏。

调整参数并观察游戏的帧率(可以看到在等级为10,cd为1的时候帧率还是挺高的)

上上强度(当等级为500,cd为1的时候可以看到此时的帧率下降明显)

 

现在看看加入对象池的效果 

 首先创建一个BulletPoolManager空对象和对应的脚本,并将脚本拖到空对象上

using System.Collections.Generic;
using UnityEngine;public class BulletPoolManager : MonoBehaviour
{// 子弹的预制体public GameObject bulletPrefab;//初始化对象池private Queue<GameObject> pool = new Queue<GameObject>();//单例模式public static BulletPoolManager Instance;void Awake(){if (Instance == null){Instance = this;DontDestroyOnLoad(gameObject);}else{Destroy(gameObject);}}//创建子弹的方法public GameObject GetBullet(){if (pool.Count > 0){GameObject obj = pool.Dequeue();obj.SetActive(true);return obj;}else{// 如果对象池里面没有可用的子弹,则实例化一个新的子弹对象//注意这里是为了演示所有子弹是直接从预制体中实例化的,实际使用时,需要动态创建子弹对象GameObject newbullet = Instantiate(bulletPrefab);  return newbullet;}}// 回收子弹的方法public void ReturnBullet(GameObject bullet){bullet.SetActive(false);bullet.transform.SetParent(transform);pool.Enqueue(bullet);}
}

将子弹的预制体拖到回收池对应位置(这里为了方便直接用拖的,实际使用的时候根据需要修改这里) 

 修改技能代码

主要修改的地方

using System.Collections;
using UnityEngine;public class Skill : MonoBehaviour
{public int _SkillLv;//技能等级public GameObject bluut;//子弹预制体[Header("可调节参数")]//速度合成public float _Speedy;public float _Speedx;public float  _cd;void Start(){StartCoroutine(FireCoroutine());}//定义一个携程,用于在一定时间后发射子弹//间隔为_cd秒IEnumerator FireCoroutine(){while (true){yield return new WaitForSeconds(_cd);fashe(_SkillLv);}}//发射子弹的方法void fashe(int lv){for (int i = 0; i < lv; i++){GameObject bullet = BulletPoolManager.Instance.GetBullet();bullet.transform.position = transform.position;bullet.transform.parent = gameObject.transform;int randomY = Random.Range(200, (int)_Speedy);int randomX = Random.Range(-(int)_Speedx, (int)_Speedx);bullet.GetComponent<Rigidbody2D>().AddForce(new Vector2(randomX, randomY));StartCoroutine(ReturnBullet(bullet));}}IEnumerator ReturnBullet(GameObject bullet){yield return new WaitForSeconds( 5f);BulletPoolManager.Instance.ReturnBullet(bullet);}
}

运行游戏并修改参数我们会发现同样等级10,cd=1的时候的帧率要高于不用回收池的时候。

试试等级500,cd为1

 可以看到使用对象池还是有一点提升的。

你可以在这里看到回收的对象

这是用的对象池是用队列来存储回收的对象的,在实际开发中并不一定要使用队列,只要能存储多个对象的数据结构不管是泛型还是数组都可以当做对象池。

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

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

相关文章

【再谈设计模式】模板方法模式 - 算法骨架的构建者

一、引言 在软件工程、软件开发过程中&#xff0c;我们经常会遇到一些算法或者业务逻辑具有固定的流程步骤&#xff0c;但其中个别步骤的实现可能会因具体情况而有所不同的情况。模板方法设计模式&#xff08;Template Method Design Pattern&#xff09;就为解决这类问题提供了…

【大模型】Langchain-Chatchat-v0.3.1 的环境配置

1 Langchahin-chatchat的工程简介 本项目是利用 langchain 思想实现的基于本地知识库的问答应用&#xff0c;目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 本项目的最新版本中可使用 Xinference、Ollama 等框架接入 GLM-4-Chat、 Qwen2-In…

jenkins的作用以及操作

一 jenkins 1.1 概念 1.2 流程 1.2.1 流程 1.2.2 配置 1.3 jenkins容器自动化部署

【UE5 C++课程系列笔记】29——在UE中使用第三方库的流程

目录 前言 步骤 一、新建插件 二、创建第三方库 三、使用第三方库 前言 主要就是介绍如何将普通C++工程生成的头文件和.dll导入到UE中去使用。 步骤 一、新建插件 1. 打开插件浏览器选项卡 2. 打开插件创建器 3. 选择“第三方库”,这里命名为“MyThirdPartyLibrary…

Mybatis——Mybatis开发经验总结

摘要 本文主要介绍了MyBatis框架的设计与通用性&#xff0c;阐述了其作为Java持久化框架的亮点&#xff0c;包括精良的架构设计、丰富的扩展点以及易用性和可靠性。同时&#xff0c;对比了常见持久层框架&#xff0c;分析了MyBatis在关系型数据库交互中的优势。此外&#xff0…

【数据结构-堆】【二分】力扣3296. 移山所需的最少秒数

给你一个整数 mountainHeight 表示山的高度。 同时给你一个整数数组 workerTimes&#xff0c;表示工人们的工作时间&#xff08;单位&#xff1a;秒&#xff09;。 工人们需要 同时 进行工作以 降低 山的高度。对于工人 i : 山的高度降低 x&#xff0c;需要花费 workerTimes…

网络传输层TCP协议

传输层TCP协议 1. TCP协议介绍 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一个要对数据的传输进行详细控制的传输层协议。 TCP 与 UDP 的不同&#xff0c;在于TCP是有连接、可靠、面向字节流的。具体来说&#xff0c;TCP设置了一大…

玩转大语言模型——langchain调用ollama视觉多模态语言模型

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 langchain调用ollama视觉多模态语言模型 系列文章目录前言使用Ollama下载模型查找模型下载模型 测试模型ollama测试langchain测试加载图片加载模型…

3 前端: Web开发相关概念 、HTML语法、CSS语法

文章目录 前言:导学1 Web开发相关概念2 Web标准(网页标准)3 软件架构(CS/BS)(1)C/S: Client/Server 客户端 / 服务器端(2)B/S: Browser/Server 浏览器 / 服务器端VSCode配置前段开发环境一、HTML概念1 概念2 HTML快速入门(1)语法快速入门(2)VSCode一个 !(快捷键…

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

项目实战--网页五子棋(用户模块)(1)

接下来我将使用Java语言&#xff0c;和Spring框架&#xff0c;实现一个简单的网页五子棋。 主要功能包括用户登录注册&#xff0c;人机对战&#xff0c;在线匹配对局&#xff0c;房间邀请对局&#xff0c;积分排行版等。 这篇文件讲解用户模块的后端代码 1. 用户表与实体类 …

【HTML+CSS+JS+VUE】web前端教程-16-HTML5新增标签

扩展知识 div容器元素,也是页面中见到的最多的元素 div实现

Codeforces Round 995 (Div. 3)【题解】D ~ G

比赛地址传送门 D.Counting Pairs 注意到确定一个数后&#xff0c;第二个数可以一个范围内任选。故排序二分查找上下界后计数 #include <bits/stdc.h> #define int long long using namespace std; typedef pair<int, int> PII; const int N 4e5 10;int n, x, …

【Linux】Linux基础命令(二)

locate命令 locate命令可以用于快速查找文件的路径&#xff0c;比如我要查找所有.cpp文件的路径&#xff1a; sudo locate *.cppless 命令 less命令和more命令类似&#xff0c;都是查看文件内容&#xff0c;但less命令更强大 可以使用光标上下&#xff08;左右&#xff09;…

自动化构音障碍严重程度分类:基于声学特征与深度学习的研究 学习技术

自动化构音障碍严重程度分类 原文名称&#xff1a;Automated Dysarthria Severity Classification:A Study on Acoustic Features and Deep Learning Techniques 摘要 本文比较了不同深度学习技术和声学特征在构音障碍严重程度分类中的应用。研究评估了深度神经网络&#xff0…

【NLP】ELMO、GPT、BERT、BART模型解读及对比分析

文章目录 一、基础知识1.1 Word Embedding&#xff08;词嵌入&#xff09;1.2 词嵌入模型1.3 神经网络语言模型NNLM 二、ELMO2.1 ELMO的提出2.2 ELMO核心思想2.3 ELMO的优缺点 三、GPT3.1 Transformer3.2 GPT简介3.3 GPT模型架构3.4 预训练及微调3.5 GPT和ELMO对比 四、BERT4.1…

EasyExcel(二)导出Excel表自动换行和样式设置

EasyExcel(一)导出Excel表列宽自适应 背景 在上一篇文章中解决导出列宽自适应,然后也解决了导出列宽不可超过255的问题。但是实际应用场景中仍然会有导出数据的长度超过列宽255。这时导出效果就会出现如下现象: 多出列宽宽度的内容会浮出来,影响后边列数据的显示。 解决…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

分类模型为什么使用交叉熵作为损失函数

推导过程 让推理更有体感&#xff0c;进行下面假设&#xff1a; 假设要对猫、狗进行图片识别分类假设模型输出 y y y&#xff0c;是一个几率&#xff0c;表示是猫的概率 训练资料如下&#xff1a; x n x^n xn类别 y ^ n \widehat{y}^n y ​n x 1 x^1 x1猫1 x 2 x^2 x2猫1 x …

快速导入请求到postman

1.确定请求&#xff0c;右键复制为cURL(bash) 2.postman菜单栏Import-Raw text&#xff0c;粘贴复制的内容保存&#xff0c;请求添加成功