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
可以看到使用对象池还是有一点提升的。
你可以在这里看到回收的对象
这是用的对象池是用队列来存储回收的对象的,在实际开发中并不一定要使用队列,只要能存储多个对象的数据结构不管是泛型还是数组都可以当做对象池。
相关文章:

Unity中对象池的使用(用一个简单粗暴的例子)
问题描述:Unity在创建和销毁对象的时候是很消耗性能的,所以我们在销毁一个对象的时候,可以不用Destroy,而是将这个物体隐藏后放到回收池里面,当再次需要的时候如果回收池里面有之前回收的对象,就直接拿来用…...
linux命令行连接Postgresql常用命令
1.linux系统命令行连接数据库命令 psql -h hostname -p port -U username -d databasename -h 主机名或IP地址 -p 端口 -U 用户名 -d 连接的数据库 2.查询数据库表命令 select version() #查看版本号 \dg #查看用户 \l #查询数据库 \c mydb #切换…...
每日一题-单链表排序
为了对给定的单链表按升序排序,我们可以考虑以下解决方法: 思路 归并排序(Merge Sort):由于归并排序的时间复杂度为 O ( n log n ) O(n \log n) O(nlogn),并且归并排序不需要额外的空间(空…...
webpack04服务器配置
webpack配置 entryoutput filenamepathpublicPath 。。 打包引入的基本路径,,,比如引入一个bundle.js,。引用之后的路径就是 publicPathfilename -devServer:static : 静态文件的位置。。。hostportopencompress : 静态资源是否用gzip压缩hi…...

JDK下载安装配置
一.JDK安装配置。 1.安装注意路径,其他直接下一步。 2.配置。 下接第4步. 或者 代码复制: JAVA_HOME D:\Program Files\Java\jdk1.8.0_91 %JAVA_HOME%\bin 或者直接配置 D:\Program Files\Java\jdk1.8.0_91\bin 3.验证(CMD)。 java javac java -version javac -version 二.下…...

30_Redis哨兵模式
在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性…...
NLP三大特征抽取器:CNN、RNN与Transformer全面解析
引言 自然语言处理(NLP)领域的快速发展离不开深度学习技术的推动。随着应用需求的不断增加,如何高效地从文本中抽取特征成为NLP研究中的核心问题。深度学习中三大主要特征抽取器——卷积神经网络(Convolutional Neural Network, …...

《使用 YOLOV8 和 KerasCV 进行高效目标检测》
《使用 YOLOV8 和 KerasCV 进行高效目标检测》 作者:Gitesh Chawda创建日期:2023/06/26最后修改时间:2023/06/26描述:使用 KerasCV 训练自定义 YOLOV8 对象检测模型。 (i) 此示例使用 Keras 2 在 Colab 中…...
从MySQL迁移到PostgreSQL的完整指南
1.引言 在现代数据库管理中,选择合适的数据库系统对业务的成功至关重要。随着企业数据量的增长和对性能要求的提高,许多公司开始考虑从MySQL迁移到PostgreSQL。这一迁移的主要原因包括以下几个方面: 1.1 性能和扩展性 PostgreSQL以其高性能…...

服务器一次性部署One API + ChatGPT-Next-Web
服务器一次性部署One API ChatGPT-Next-Web One API ChatGPT-Next-Web 介绍One APIChatGPT-Next-Web docker-compose 部署One API ChatGPT-Next-WebOpen API docker-compose 配置ChatGPT-Next-Web docker-compose 配置docker-compose 启动容器 后续配置 同步发布在个人笔记服…...
51单片机 和 STM32 的烧录方式和通信协议的区别
51单片机 和 STM32 的烧录方式和通信协议的区别 1. 为什么51单片机需要额外的软件(如ISP)? (1)51单片机的烧录方式 ISP(In-System Programming): 51单片机通常通过 串口(…...

(STM32笔记)十二、DMA的基础知识与用法 第二部分
我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 二、DMA传输设置1、数据来源与数据去向外设到存储器存储器到外设存储器到存储器 2、每次传输大小3、传…...

【优选算法篇】:模拟算法的力量--解决复杂问题的新视角
✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:优选算法篇–CSDN博客 文章目录 一.模拟算法二.例题1.替换所有的问号2.提莫攻击3.外观数列4…...

探秘 JMeter (Interleave Controller)交错控制器:解锁性能测试的隐藏密码
嘿,小伙伴们!今天咱们要把 JMeter 里超厉害的 Interleave Controller(交错控制器)研究个透,让你从新手直接进阶成高手,轻松拿捏各种性能测试难题! 一、Interleave Controller 深度剖析 所属家族…...

脚本化挂在物理盘、nfs、yum、pg数据库、nginx(已上传脚本)
文章目录 前言一、什么是脚本化安装二、使用步骤1.物理磁盘脚本挂载(离线)2.yum脚本化安装(离线)3.nfs脚本化安装(离线)4.pg数据库脚本化安装(离线)5.nginx脚本化安装(离…...

ESP嵌入式开发环境安装
前期准备,虚拟机,ios镜像,VSCode。 centOS8:centos安装包下载_开源镜像站-阿里云 虚拟机:vmware VSCode:Visual Studio Code - Code Editing. Redefined 如何安装镜像自行查找 完成以上环境后进行一下操…...

Elasticsearch入门学习
Elasticsearch是什么 Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索和分析引擎、可扩展的数据存储和矢量数据库。 它针对生产规模工作负载的速度和相关性进行了优化。 使用 Elasticsearch 近乎实时地搜索、索引、存储和分析各种形状和大小的数据。 特点 分布式&a…...

黑马linux笔记(03)在Linux上部署各类软件 MySQL5.7/8.0 Tomcat(JDK) Nginx RabbitMQ
文章目录 实战章节:在Linux上部署各类软件tar -zxvf各个选项的含义 为什么学习各类软件在Linux上的部署 一 MySQL数据库管理系统安装部署【简单】MySQL5.7版本在CentOS系统安装MySQL8.0版本在CentOS系统安装MySQL5.7版本在Ubuntu(WSL环境)系统…...
《软硬协同优化,解锁鸿蒙系统AI应用性能新高度》
在当今数字化时代,鸿蒙系统与人工智能的融合正逐渐成为科技领域的热门话题。如何通过软件和硬件协同优化,进一步提升鸿蒙系统中AI应用的整体性能,成为了开发者和技术爱好者们关注的焦点。 鸿蒙系统与AI应用的融合现状 鸿蒙系统以其独特的微…...
利用 Tree Shaking 提升 React.js 性能
Tree Shaking 是现代 JavaScript 应用中不可或缺的优化技术,它通过移除未使用的代码来减少最终打包的大小。对于 React.js 应用,这一技术尤为重要,因为随着组件和第三方库的增多,打包体积可能迅速膨胀。Tree Shaking 能显著提升加…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...