你都学会栈和队列了赶紧手搓一个对象池吧!!!(超详细,超简单适合新手宝宝学习)

news2024/9/20 6:05:46

前置知识:en造数据结构与算法C# 用数组实现个栈还不简单???看我一秒破之!!!(unity演示)-CSDN博客

c#有官方造好的关于stack的轮子,建议学习学习拿来直接用 

本节实现目标:(注意右侧的Cube数量没有增加而是循环激活和失活)

1.对象池详解

        对象池是一种优化游戏性能的技术,特别适用于需要频繁创建和销毁对象的场景,比如子弹、敌人、特效等。在Unity中,对象池可以显著减少内存分配和垃圾回收的开销,从而提高游戏的运行效率

 流程图解:对象池的基本原理无非就三个步骤:创建指定数量的物体,调用物体(激活%拿出),释放物体(失活&放回),之后就是激活&拿出和失活&放回之间的循环

内存图解:因为对象池就像是一个定长数组一样,所以内存是一连串而非碎片化的

对象状态图解:传统创造和销毁物体后,需要新的物体就要再创建

对象池是把需要销毁的物体重新放回池子里

2.代码详解 

之所以全部拿过来了,是因为我注释写的巨详细,直接看下去会很连贯

using System.Collections.Generic;
using UnityEngine;

public class MyPool {
    //stack作为对象池容器
    private Stack<GameObject> pool;
    //玩家可能需要调用的预制体
    private GameObject prefab;

    //像对象池创建预制体prefab和指定的数量initialCapacity
    public MyPool(GameObject prefab, int initialCapacity) {

        this.prefab = prefab;
        //实例化容器对象
        pool = new Stack<GameObject>(initialCapacity);
    
        for (int i = 0; i < initialCapacity; i++) {
            //存储实例化物体
            GameObject obj = GameObject.Instantiate(prefab);
            //失活
            obj.SetActive(false);
            //压栈
            pool.Push(obj);
        }
    }

    //玩家调用物体
    public GameObject Get() {
        //保险判断,如果对象池中有可用对象就弹栈返回出该对象
        if (pool.Count > 0) {
            return pool.Pop();
        }
        //如果没有的话,就创建并失活并返回
        else {
         
            GameObject obj = GameObject.Instantiate(prefab);
            obj.SetActive(false);//这里可以改成ture

            //至于为什么不压栈了,因为直接创建直接返回出去就得了,再压栈就还需要再弹栈,代码就重复了
            // pool.Push(obj); 如果有这行
            //return pool.Pop(); 那么得有这行
            return obj;
        }
    }
    //释放物体
    public void Release(GameObject obj) {
        //失活
        obj.SetActive(false);

        pool.Push(obj);
    }
}

3.使用示例

using System.Collections;
using UnityEngine;

public class UsePool : MonoBehaviour {
    //我用来演示的方块预制体
    public GameObject cubePrefab;
    //对象池对象
    private MyPool myPool;

    void Start() {
        //向对象池放东西
        myPool = new MyPool(cubePrefab, 10);
    }

    void Update() {
        //通过旧输入系统,按下空格就使用对象池的调用物体方法
        if (Input.GetKeyDown(KeyCode.Space)) {
            GameObject obj = myPool.Get();
            obj.transform.position = Random.insideUnitSphere * 5; // 随机位置
            obj.SetActive(true);//如果你的get方法里面obj.SetActive(false);改成ture了,就不需要这行代码了

            StartCoroutine(AutoRelease(obj, 2f)); // 启动协程,2秒后自动释放
        }
    }

    private IEnumerator AutoRelease(GameObject obj, float delay) {
        //注意是先等两秒再释放,第一次调用直接释放会出现空引用或者其他有意思的情况,你可以复制下来自己试试
        yield return new WaitForSeconds(delay);
        myPool.Release(obj);
    }
}

 4.一个小细节(重要)

在第二个大标题,也就是MyPool代码中的Get方法中,有一处可以改成ture

那么我为什么还要在UsePool类中添加这行

 是因为,你传进来的是一个预制体,难免预制体上会挂在脚本,或者像我一样在UsePool类中的Update里面写一些逻辑

如果你在Get中激活了,那么我的逻辑赶不上你激活的速度,就会发生意想不到事情

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭开OpenAI草莓模型神秘面纱——重塑大语言模型的逻辑能力

OpenAI即将发布“草莓”模型 来源&#xff1a;medium 据报道&#xff0c;OpenAI计划在未来两周内发布其新的AI模型Strawberry&#xff08;草莓&#xff09;。据 Seeking Alpha周二&#xff08;9 月 10 日&#xff09;援引The Information 的一篇付费文章报道&#xff0c;新模型…

Solana核心漏洞技术详解

8月9日&#xff0c;Solana团队齐心协力解决了一个严重的安全漏洞。这次秘密修复详情可以在GitHub上查询到。CertiK团队对这一漏洞进行了深入分析。 1. Solana漏洞起因 8月9日&#xff0c;Solana验证者和客户端团队齐心协力解决了一个严重的安全漏洞。Solana验证者Laine表示&am…

[WUSTCTF2020]颜值成绩

1.测试输入发现存在数字型sql注入 1 and 1 报错 尝试了几个字符&#xff0c;确定空格被过滤了 空格用/**/替换 1/**/and/**/1 构造轮子尝试成功&#xff0c;所以这里要用布尔注入 后面的思路就是比较常规的了&#xff0c;先爆破库名&#xff0c;再爆破表、字段 写了个脚本简…

第四部分:1---文件基础理解、C语言文件操作、Linux系统文件接口、使用一个变量传递多个标志位

目录 文件基础理解&#xff1a; 文件是如何组成的&#xff1f; 对文件操作的本质是什么&#xff1f; 文件被打开的本质是什么&#xff1a; 进程和文件的调度关系解析&#xff1a; 文件被打开后如何被管理&#xff08;文件描述符/文件描述符表&#xff09;&#xff1f; 文…

深度学习——基础知识

深度学习的重点在于优化&#xff0c;其中很重要的步骤在于如何调参&#xff0c;会涉及到一些微积分等数学知识。不同于以往接触到的数值运算&#xff0c;深度&#xff08;机器&#xff09;学习都是关于张量Tensor&#xff08;向量&#xff09;的计算&#xff0c;Python中最常用…

【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项

前言&#xff1a; 滑动窗口其实基本原理还是双指针&#xff0c;但在双指针中左右指针可能会有回退操作&#xff0c;而滑动窗口的左右指针只会向前走&#xff0c;不会回退&#xff0c;下面就来讲解一下滑动窗口的概念和具体操作&#xff08;主要是例题讲解&#xff09; 目录 一、…

【 Linux】基础命令及常用小技巧

文章目录 Linux基础命令常用小技巧基本命令pwd : print work directory 打印当前的工作目录cd : change driectory 改变当前工作目录ls: list 查看指定目录下的文件mkdir: make directory 创建目录 文件操作命令查找命令管道命令和过滤命令wc : word count 单词统计echo 输出命…

Hotohiko Sakamoto算法,以及用其计算星期几【算法 15】

探索Hotohiko Sakamoto算法&#xff1a;构建素数排列的奥秘 在算法领域&#xff0c;Hotohiko Sakamoto算法以其独特的构造方式和深刻的数学背景&#xff0c;吸引了众多算法爱好者和研究者的关注。本文将带您一起探索Hotohiko Sakamoto算法的核心思想&#xff0c;了解它是如何构…

深度学习_GPT2Block详解(casual attention)

一、GTP2Block 整体结构 1.1 block准备 import torch from torch import nn from transformers import GPT2Model, GPT2Config from transformers.models.gpt2.modeling_gpt2 import GPT2Blockcfg GPT2Config() print(cfg.add_cross_attention) blk GPT2Block(cfg, layer_…

“汉语新解” Prompt新高度,火爆的李继刚

“汉语新解” prompt 是由李继刚设计的一个用于启发人工智能模型进行创意性文本生成的指令模板。这个 prompt 的设计初衷是为了让AI能够以一种独特的方式解析和重新诠释常见的中文词汇&#xff0c;从而产生出具有深刻洞察力和幽默感的文本内容&#xff0c;仿佛是由鲁迅或林语堂…

Linux线程同步:深度解析条件变量接口

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;Linux线程同步&#x1f409;条件变量---实现线程同步&#x1f4a7;同步概念与竞态条件&#x1f406;条件变量接口*初始…

sqli-labs靶场自动化利用工具——第13关

文章目录 概要整体架构流程技术细节执行效果小结 概要 Sqli-Labs靶场对于网安专业的学生或正在学习网安的朋友来说并不陌生&#xff0c;或者说已经很熟悉。那有没有朋友想过自己开发一个测试脚本能实现自动化化测试sqli-labs呢&#xff1f;可能有些人会说不是有sqlmap&#…

每日OJ_牛客_马戏团(模拟最长上升子序列)

目录 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 解析代码 牛客_马戏团&#xff08;模拟最长上升子序列&#xff09; 马戏团__牛客网 搜狐员工小王最近利用假期在外地旅游&#xff0c;在某个小镇碰到一个马戏团表演&#xff0c;精彩的表演结束后发现团长正和大…

《基于深度半监督学习的目标检测综述》泛读

基于深度半监督学习的目标检测方法分为 1、生成式方法 2、一致性正则化方法 3、基于图的方法 4、伪标记方法和混合方法 然后基于常用数据集 对典型方法进行了性能对比&#xff0c;最后分析了其挑战和发展趋势&#xff0c;旨在为相关研究提供参考 收获就是&#xff1a; 1…

Redis -- 全记录(面试)

目录 All : 缓存穿透 缓存击穿 互斥锁 逻辑过期 比较 : 缓存雪崩 redis怎么和数据库保持一致 双写一致性 : 延迟双删 : 保证强一致性 : 允许一定的延迟 基于mq的异步通知 基于Canal的异步通知 总结 Redis的持久化 RDB AOF 总结 Redis数据过期策略 惰性删除…

【算法专题】搜索算法

二叉树剪枝 LCR 047. 二叉树剪枝 - 力扣&#xff08;LeetCode&#xff09; 本题要求我们将全部为0的二叉树去掉&#xff0c;也就是剪枝&#xff0c;当我们举一个具体的例子进行模拟时&#xff0c;会发现&#xff0c;只关注于对其中一个子树的根节点进行剪枝&#xff0c;由于我…

Docker部署MySQL8.0.39报错解决方案

Docker部署MySQL8.0.39报错解决方案 2024-09-11T06:09:09.317582Z 0 [Warning] [MY-010139] [Server] Changed limits: max_open_files: 1024 (requested 8161) 2024-09-11T06:09:09.317586Z 0 [Warning] [MY-010142] [Server] Changed limits: table_open_cache: 431 (reques…

李彦宏内部讲话曝光,谈大模型三大认知误区:智能体还是非共识

“外界对大模型有相当多的误解&#xff0c;”近日据媒体报道&#xff0c;李彦宏的一则内部讲话曝光。在最近一次和员工交流中&#xff0c;李彦宏谈及三个大模型认知误区&#xff0c;涵盖了大模型竞争、开源模型效率、智能体趋势等热点话题。 李彦宏认为未来大模型之间的差距可…

【Axure教程】高级搜索

高级搜索可以通过使用精确的关键词或短语&#xff0c;帮助用户找到特定的内容。尤其在面对大量搜索结果时&#xff0c;通过过滤条件缩小范围&#xff0c;能够节省时间。他允许用户使用多个条件进行组合&#xff08;例如条件匹配、模糊搜索、区间筛选等&#xff09;来精准获取相…

购物车装载状态检测系统源码分享

购物车装载状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…