[Unity] 对象池

[Unity] unity中对象池的使用 在现代游戏引擎设计中中,使用的大多都是托管内存,基于此我们不必手动管理内存,造成内存泄露等问题。对于unity中的游戏对象,每隔一段时间,Mono的垃圾回收机制将会检测内存,将没有再被引用的内存释放回收。当我们使用一个新的游戏物品(实例)时,首先需要实例化它(Instantiate,实际上也是基于new的机制实现的),在我们使用GameObject完成后便摧毁它(Destory) 但是,申请实例化时,意味着我们需要在托管堆上分配一块新的内存给Object,在回收时,我们需要等待回收机制收回 阅读详情

[Unity] ObjectPool

1.设计

  • IPoolable

    InPooled 用于追踪对象的状态,在/不在池中。

    Pool 用于引用对象所属的对象池,作为标记。

  • Pool

    使用栈数据结构储存对象。

    构造函数,包括对象池所装的实例对象instance,入池的回调函数OnPooled,池子的初始化大小poolSize,池子是否可以自动扩容fixedSize。

    public Pool (T instance, Action<T> onPooled, int poolSize = 10, bool fixedSize = true) {
        this.m_PoolSize = poolSize;
        this.m_FixedSize = fixedSize;
        this.m_Instance = instance;
    
        this.m_OnPooled = onPooled;
    
        for (int i = 0; i < poolSize; i++) {
            T item = GameObject.Instantiate<T> (m_Instance);
            m_Objects.Push (item);
    
            item.Pool = this;
    
            m_OnPooled?.Invoke (item);
    
            item.InPooled = true;
        }
    }
    

    New、Free、ClearPool

    public T New () {
        T item = default (T);
    
        if (m_Objects.Count > 0) {
            item = m_Objects.Pop ();
        } else {
            if (!m_FixedSize) {
                m_PoolSize++;
            } else {
                Debug.LogWarning ("No object avaliable, Create new Instance!");
            }
    
            item = GameObject.Instantiate<T> (m_Instance);
            item.Pool = this;
        }
    
        if (item) {
            item.InPooled = false;
        }
        return item;
    }
    
    public void Free (T item) {
        if (!item) {
            Debug.LogError ("Null refrence"); return;
        }
    
        if (item.Pool == this && !item.InPooled) {
            if (!m_FixedSize || m_PoolSize > m_Objects.Count) {
    
                m_Objects.Push (item);
    
                m_OnPooled?.Invoke (item);
    
                item.InPooled = true;
            } else {
                GameObject.Destroy (item.gameObject);
                Debug.LogWarning ("Instance can't return to Pool,destroy Instance");
            }
        }
    }
    
    public void ClearPool () {
        foreach (var item in m_Objects) {
            GameObject.Destroy (item);
        }
        m_Objects.Clear ();
        m_OnPooled = null;
    }
    

测试图

2.总结

本案例采用了管理类来管理各种各样的对象池。这样有利于制作可复用的对象池,但需要追踪对象的状态,这需要额外方法来解决,本例中,IPoolable接口中的Pool、InPooled参数用来解决此问题。

除了使用管理类来管理对象池,也可以直接在一个对象内部创建对象池。这样对象的状态由对象自身来管理。这种情况,可以去除Pool、InPooled这两个条件检查,参考Git工程下,Pool.cs中的ObjectPool类。

另外在本例中,使用委托,可以对对象进行一些额外操作,更灵活。

Git地址:https://github.com/Sarofc/UnityTools

参考资料:https://gpp.tkchu.me/object-pool.html

Unity中对象池(Object Pool)技术解析与实现 本文深入探讨了对象池(Object Pool)在游戏开发中的应用与实现。对象池是一种设计模式,通过预先创建并重用对象,避免频繁的内存分配和释放,从而显著提升游戏性能。文章阐述了在Unity中使用对象池的必要性,并提供了一个简单实用的代码示例,展示了如何构建一个基础的对象池类,包括对象的预实例化、获取和归还功能。本文旨在帮助读者快速掌握对象池的核心理念及其在实际开发中的优化作用,提升游戏的流畅度和效率。 阅读详情

相关推荐

Unity学习之对象池

Unity学习之对象池

qq_34123138的博客 3506

unity---对象池

unity 对象池浅析

学海无涯 6083

unity - 对象池技术的实现与应用

本人之前发表在蛮牛网上的,现迁移至此。 本文为学习总结文章,如有错误请大神们指出~ 理论参考:http://www.cnblogs.com/mezero/p/3955130.html 代码参考:http://www.omuying.com/article/78.aspx 背景:首先为什么会去了解对象池技术,原因是我的游戏在iOS上运行时出现了问题,有时会闪退,于是网上寻

心之所至的博客 7268

Unity 对象池

unity对象池

明明明的博客 4048

Unity简易对象池

因为会引发人为不可控的自动GC操作,一旦操作量达到一定峰值,主线程都会有明显的卡顿.为了避免这种情况发生,也为了程序更好的管理出现了这类简易的对象池.大鱼塘组成1.一大块地皮(所有对象池的父节点)和2.好多个小池子,包括每个池子的品种名(字典,键是类型,值是对象池类)但简易对象池也不是完美的,因为要临时存储实例化的物体,会有一定的内存占用,可自行加上时间管理器,去动态的丢弃许久未使用的对象.即一个大鱼塘(管理类),里面管理了各种小池子,(不理解有空可以去内陆的水产养殖基地参观游玩),.........

weixin_56104874的博客 1054

unity对象池之引用技术

推荐阅读:  我的优快云  我的博客园  QQ群:704621321  我的个人博客 专门写一篇文章来和大家分享一下引用技术,为什么呢?因为第一次听说这么名词,觉得高大上,不要害怕,其实道理挺简单的,待我细细来说明。 使用引用技术的前提是你得使用对象池,对于对象池这个东西,我就不作详细介绍了,对象池用来存放会被经常使用的东西,当需要用的时候就从对象池里取出来用,不需要用时就将它放进池子里。那么问题来了,对象池里面的对象都是唯一的,如果某个对象会同时在两个..

爱上游戏开发 2934

Unity进阶---对象池/缓存池

(英语:object pool pattern)是一种。一个包含一组已经初始化过且可以使用的对象,而可以在有需求时创建和销毁对象。池的用户可以从池子中取得对象,对其进行操作处理,并在不需要时归还给池子而非直接销毁它。这是一种特殊的工厂对象。若初始化、实例化的代价高,且有需求需要经常实例化,但每次实例化的数量较少的情况下,使用对象池可以获得显著的效能提升。从池子中取得对象的时间是可预测的,但新建一个实例所需的时间是不确定。来自。

qq_63486332的博客 4988

UE5 使用Slate制作对话窗口

使用Slate制作对话框窗口并获取对话框结果,非UMG

qq_25521145的博客 3186

Unity对象池和自写对象池

一. 什么是对象池顾名思义就是一定数量的已经创建好的对象(Object)的集合。当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对象,同样,当对象需要销毁时,不做真正的销毁,而是将其setActive(false),并存入池子中,这样就避免了大量对象的创建。好处:降低性能,减少反复生成和摧毁产生的大量GC。坏处:①回收过程复杂度增加,在下次使用的同时,需要清空回收前的数据。②生命周期比其他的对象较长。

新东西新事物.... 4608

从DBC到ARXML:用RTA-CAR7实现车载通信协议栈自动化生成全流程

本文详细介绍了如何利用ETAS RTA-CAR7工具链,特别是ISOLAR-A和RTA-BSW ConfGen,实现从车载通信DBC文件到AUTOSAR ARXML系统描述文件,再到基础软件(BSW)协议栈代码的自动化生成全流程。该流程通过深度配置、信号路由、PDU复用及规则定制,大幅提升开发效率与一致性,是应对现代汽车电子复杂网络开发的关键实践。

brandy的博客 219

CSP-J/S复赛文件组织与freopen读写全攻略,避免爆零

在信息学竞赛的上机考试中,代码能力固然重要,但文件组织与输入输出重定向往往是决定成败的关键细节。许多选手习惯在线评测环境,对本地文件命名、目录层级和读写方式缺乏系统认知,导致算法正确却因文件名拼写错误或freopen使用不当而遗憾失分。理解评测系统的工作原理,掌握从建立准考证号目录到规范命名源文件,再到使用freopen进行文件流重定向的标准流程,是每位参赛者的必备技能。这种工程化习惯不仅适用于CSP-J/S复赛,也是未来参加NOI等更高水平竞赛的基础。本文从文件组织的底层逻辑出发,结合实战案例,系统讲解考

weixin_32466193的博客 584

Unity框架之对象池GameObjectPool

Unity框架之对象池GameObjectPool 文章目录Unity框架之对象池GameObjectPool对象池的核心思想对象池的使用流程对象池的设计通用的对象池框架对象池的数据结构关键方法:获取游戏对象关键方法:回收游戏物体对象池的拓展对象池的完整源码 对象池的核心思想 将需要频繁创建销毁的游戏对象缓存起来,将创建销毁行为替换成显示和隐藏,大大提高游戏运行效率。 典型的以空间换时间的思想 对象池的使用流程 对象池的设计 根据上图对象池的使用流程分析对象池的特点 每个类型的对象应该有属于自己的独立的

Q540670228的博客 6790

Python 爬虫实战:豆瓣电影海报批量获取(Top250 榜单 + 可视化展示)

在信息爆炸的时代,数据已成为决策的核心,而数据的获取是数据分析的第一步。本文将详细介绍如何利用 Python 爬虫获取豆瓣电影 Top250 榜单的海报,并对数据进行可视化展示,助你更好地了解电影市场的趋势和用户的喜好。

yansideyucsdn的博客 716

Unity中,对象池

在Unity中,对象池是一种重复使用游戏对象的技术,它可以帮助我们避免频繁创建和销毁游戏对象,从而提高游戏的性能。对象池通常被用于需要频繁创建和销毁游戏对象的场景,比如子弹、敌人、粒子等。

qq_20179331的博客 1033

各向同性、VTI、TTI以及双相介质波场数值模拟

各位读者,大家好!在今天的文章中,我将介绍关于波场数值模拟中的各向同性、VTI(垂直横向等参数介质)、TTI(倾斜横向等参数介质)以及双相介质的基本概念。同时,我也会提供一些基础的Fortran代码片段,供大家了解和学习。

qq_38334677的博客 1702

樽海鞘优化算法详解:原理、实现与应用

本文详细介绍了樽海鞘优化算法(SSA)的原理、实现与应用。该算法模拟樽海鞘链式群体行为,将优化问题解空间映射为群体移动空间,通过领导者引导和追随者跟随的协作机制寻找最优解。文章从生物特性、数学模型到Python代码实现进行了系统阐述,包括种群初始化、位置更新公式和收敛因子等核心要素,并展示了算法在函数优化等领域的应用潜力。该算法具有结构简单、参数少、实现容易等特点,在多种优化问题上表现良好。

qq_42212808的博客 641

unity 对象池模式

1、理解 对象池用于减少内存开销,其原理就是把可能用到到的对象,先存在一个地方(池),要用的时候就调出来,不用就放回去。而不是要用的时候创建,不用的时候销毁。 Eg:   我有个飞机,射击子弹,按传统的方法就是,创建子弹,子弹击中目标或出界等销毁子弹。就是不断的创建与销毁,要知道创建和销毁是要消耗许多内存以及时间的。如果把子弹存在一个地方(池),需要子弹时,就从里面拿出来,不需要的时候放回去。      如果还有多个飞机,可以公用一个子弹库。   这个方法虽然一直保持着存储子弹空间的一个最大值,但相比不断创

LuckyMechanic的博客 3157

YOLOv5 自定义模型 Android 部署完整指南

本文详细介绍了将YOLOv5模型部署到Android设备的完整流程,包含三个核心部分:首先验证官方模型测试,确保基础环境配置正确;随后进行模型转换,从PyTorch导出ONNX格式并优化,再转换为NCNN格式;最后在Android项目中集成自定义模型,包括文件替换、参数修改和代码适配。教程基于YOLOv5 6.1版本,使用NCNN框架进行移动端推理,涵盖了常见问题解决方案和关键配置要点,为开发者提供了从训练到部署的完整技术路线。

FJN110的博客 591

Unity对象池

在unity的2021版本后,Unity引入了对象池,从这以后就可以用Unity内置的对象池,这次我们就来演示一下Unity内置的对象池。

tongmeng_yiran的博客 1685

Unity接入抖音小程序侧边栏

Unity接入抖音小程序侧边栏功能实践总结 本文分享了Unity游戏接入抖音小程序侧边栏复访功能的实现过程。针对官方文档不清晰的问题,作者详细介绍了关键实现步骤:通过TT.CheckScene检测侧边栏可用性,利用OnShow事件监听判断用户是否从侧边栏进入,并提供了完整的UI交互代码示例。重点功能包括:检测宿主版本支持、区分侧边栏入口与非侧边栏入口的界面展示、实现跳转侧边栏场景等。文中附有官方文档链接和效果截图,为开发者提供了实用的接入参考方案。

类人_猿的博客 610

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Unity】对象池

Unity对象池

m0_67428211的博客 791

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Unity对象池技术

Unity对象池技术 https://blog.youkuaiyun.com/LemonXQ/article/details/77148886   顾名思义,对象池是存放对象的缓冲区。用户可以从缓冲区中放入/取出对象。一类对象池存放一类特定的对象。那么对象池有什么用呢?在游戏中,经常会有产生/销毁大量同类游戏对象的需求,比如游戏中源源不断的敌人、频繁刷新的宝箱、乃至一些游戏特效(风、雨等)。如果没有一种比...

qq_35422344的博客 3265

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Unity对象池初识

Unity对象池初了解 目录Unity对象池初了解前言一、对象池是什么?二、代码实现对象池1.首先创建一个空物体,以作为我们的第一个预制体来使用对象池2.编写对象池!!!3.编写Dash脚本总结 前言 例如:随着对游戏设计的深入了解,本文就介绍了unity的对象池的基础内容。 一、对象池是什么? 对象池简单来说就好比一个池子,有一池子空物体,预制体,一开始就实例化这些物体,当我们需要使用时,便从其他将其拿出(SetActive(true)),当用完时,便将其放回池子中(SetActive(false)

Leo__ch的博客 714
上一篇: [Unity]计时器
下一篇: [Unity] 事件分发系统
sarono
博客等级 码龄9年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值