Unity3D 对象池 静态预制件与动态单体

  • 效果
  • 整体思路
    • 静态预制件对象池
      • 对象池接口
      • 对象池接口继承类
    • 动态单体对象池

游戏里为了利用内存资源一般对象池是用的比较多 这里总结了两版对象池.

请结合范例工程阅读: GITHUB 地址

效果

简易弹道射击DEMO,弹道与目标均以用对象池处理

整体思路

对实例对象进行生命周期管理(GameObject显隐)
池对象的新增生命周期为 初始化(Init) , 生成(Spawn)与回收(Recycle)

静态预制件对象池

ID/池对象–池实例
针对提前定义好的预制件使用的对象池(建议与枚举绑定使用)
需要对预制件进行注册,使用Dictionary<T,ItemPoolInfo> 对所有注册的对象以及实例进行管理

ObjectPoolManager<T, Y>. Register(T identity, Y registerItem, int poolStartAmount); //注册
ObjectPoolManager<T, Y>.Spawn(T identity, Transform toTrans, Vector3 toPos, Quaternion rot);  //生成
ObjectPoolManager<T, Y>.Recycle(T identity, Y obj);       //池控制回收

对象池接口

public interface IObjectPoolStaticBase<T>{     void OnPoolInit(T identity,Action<T,MonoBehaviour> OnRecycle);        //实例初始化时初始化(调用OnRecycle进行回收)void OnPoolSpawn();     //实例被生成时调用void OnPoolRecycle(); //实例被回收时调用
}

对象池接口继承类

public class CObjectPoolStaticPrefabBase<T> :MonoBehaviour,IObjectPoolStaticBase<T>
{public bool m_PoolItemInited { get; private set; }public T m_Identity { get; private set; }private Action<T,MonoBehaviour> OnSelfRecycle;public virtual void OnPoolInit(T _identity,Action<T,MonoBehaviour> _OnSelfRecycle){m_Identity = _identity;m_PoolItemInited = true;OnSelfRecycle = _OnSelfRecycle;}public virtual void OnPoolSpawn() {  }public virtual void OnPoolRecycle() { }public void DoRecycle() =>  OnSelfRecycle?.Invoke(m_Identity, this);    //池实例自回收}

动态单体对象池

池对象–ID/池实例
针对多种小型需求对象池需求, 可以针对Component/Class/Monobehaviour的继承类型进行对象池状态管理.多用于简单的对象管理如UI Grid组件下的Object

ObjectPoolListBase<T, Y>.Spawn(T identity);        //生成指定identity的物体
ObjectPoolListBase<T, Y>.Recycle(T identity);     //移除指定identity的物体

该工程将单体对象池控制器分成三类
1.Component对象池ObjectPoolListComponent<T, Y>-GetComponent
2.Monobehaviour对象池 ObjectPoolListMonobehaviour<T, Y> -GetComponent
2.Class对象池 ObjectPoolListClass<T, Y> -Activator.CreateInstance
三类池只有实例化与Transform获取的差别
其中Class与Monobehaviour池都继承共同的接口

public interface IObjectPoolItemBase<T>
{void OnInitItem();     //池对象初始化void OnAddItem(T identity);void OnRemoveItem();Transform GetTransform();        //获取对象的transform做显隐操作
}
  感谢观看全文 遇到问题请联系作者          --StriteR 2020/5/24

Unity3D 对象池 静态预制件与动态单体相关推荐

  1. MySQL---数据库从入门走向大神系列(十)-Connection对象池、装饰模式与动态代理模式

    问题概述: 之前本系列博客写的,全部都是一个connection对象,不知道大家发现没有,我们既然做了一个Connection工具类,那么大家肯定都是从那里面拿Connection对象的,之前的如果是 ...

  2. Unity3D对象池的设计

    文章目录 为什么要使用对象池 对象池的分类 对象池存在的问题 对象池的适用范围 对象池适用于以下情况 对象池不适用于以下情况 对象池的设计 具体实现 使用例 原本的旧脚本 使用对象池改造后的脚本 修订 ...

  3. 并发加对象锁_通用并发对象池

    并发加对象锁 在本文中,我们将介绍如何在Java中创建对象池. 近年来,JVM的性能成倍增加,大多数类型的对象几乎都变得多余,从而提高了对象池的性能. 从本质上讲,对象的创建不再像以前那样昂贵. 但是 ...

  4. 深入研究池化技术——对象池

    池化技术 池化技术是性能调优的重要措施,池化的思想是把对象放到池子里,当要使用的时候,从池子里面拿对象,用完后再放回池子里,这样可以降低资源分配以及释放的开销,从而提升性能,在实际项目中,其实我们每天 ...

  5. Unity3D 内存优化(一)对象池

    一.定义: 关于U3D内存优化,一直是游戏开发者头疼的事情,由于在项目中我们会频繁地创建和销毁一些对象,例如:怪物模型或者是UI预设体,但是,部分对象在游戏中是会频繁出现的,例如战斗中的小怪物,假如每 ...

  6. 游戏物体复用:对象池(以Unity3D为例)

    需要解决/优化的问题: 在Unity3D中,实例化物体和销毁物体是都非常消耗性能的,小项目可能没问题的,但是一旦有大量的物体在短时间内需要销毁或者创建,那么游戏就会变得巨卡,如果是手游你的手机还会变烫 ...

  7. CMake I 编译静态库、动态库和对象库

    目录 一.源文件 1.Message.h 2.Message.cpp 3.helloworld.cpp 二.CMakeLists.txt 1.源文件 2.CMake语言说明 (1)cmake_mini ...

  8. Unity3D 大型游戏 最后一站 源码部分重点 对象池GameObejctPool(4)

    本文固定链接:http://blog.csdn.net/u013108312/article/details/60583764 本章我们来学习下最后一站中的对象池技术. 何为对象池,相信大部分的程序员 ...

  9. Unity3D游戏开发之类对象池优化秘籍残篇

    翻开秘籍第一页: 问: 什么是类对象池? 剑之初: 游戏中,我们常常会遇到频繁得创建和销毁大量相同对象的场景.如果我们不做任何的特殊处理,这种场景会出现两个性能问题--大量的内存碎片以及频繁的分配内存 ...

最新文章

  1. 面试题:mysql 表删除一半数据,B+树索引文件会不会变小???
  2. 模型裁剪--Rethinking the Value of Network Pruning
  3. 我写代码的十八般兵器!
  4. windows下设置socket的connect超时
  5. VTK修炼之道56:图形基本操作进阶_表面重建技术(三维点云曲面重建)
  6. 5.22递归实现数制转换
  7. JavaScript入门(part4)--简单数据类型
  8. 模板:拓展kmp(Z函数)
  9. Windows-server-2008-R2安装Oracle-11g-R2-dataguard
  10. GitHub#java#:设计模式
  11. CICD详解(一)——概念和原理
  12. CSDN用户数据库泄露事件给我们的启示
  13. UVALive 7461 - Separating Pebbles
  14. 人工智能行业知识 - AI应用场景
  15. 如何撰写和发表SCI论文
  16. 赖美云的认证照_818吴宣仪赖美云杨超越等《创造101》人气女孩旧照,鉴定是否整容~...
  17. fflush()函数
  18. IllegalArgumentException: Scrapped or attached views may not be recycled. isScrap:false isAttached:t
  19. 对抗样本生成算法复现代码解析:FGSM和DeepFool
  20. 【转】开发者需要了解的领域特定语言(DSL)

热门文章

  1. 2waySSL数字证书
  2. 1、倒车轨迹计算方法和实施!(开启+更改!)
  3. 百趣代谢组学文献分享:茶褐素可促进胆固醇降解
  4. 可食用橄榄油的美容减肥法
  5. java计算机毕业设计医护人员排班系统源码+系统+数据库+lw文档
  6. Java绘制海螺_3DMAX制作海螺工艺品教程 - 纳金网
  7. cs224u 自然语言推理:任务和数据集-1
  8. c语言期末系统答辩,C语言期末项目答辩实施方案.doc-资源下载人人文库网
  9. css波纹波动效果,js+css3催眠波纹动画特效
  10. 卸载驱动模块:已经在/lib目录下建立相应文件夹仍无法实现