1、理解

对象池用于减少内存开销,其原理就是把可能用到到的对象,先存在一个地方(池),要用的时候就调出来,不用就放回去。而不是要用的时候创建,不用的时候销毁。
Eg:
  我有个飞机,射击子弹,按传统的方法就是,创建子弹,子弹击中目标或出界等销毁子弹。就是不断的创建与销毁,要知道创建和销毁是要消耗许多内存以及时间的。如果把子弹存在一个地方(池),需要子弹时,就从里面拿出来,不需要的时候放回去。
  
  如果还有多个飞机,可以公用一个子弹库。
  这个方法虽然一直保持着存储子弹空间的一个最大值,但相比不断创建与销毁的代价,是非常值得考虑的。
  而实际开发中,可以按照需要适当放大或缩小池大小。
  
  对象池模式并不是游戏开发独有的设计模式,它的设计思路与其他开发中的数据库连接池、线程池的思路等是一样的。

其核心思想是,使用完不直接删除,而是将其放回池子里,需要用的时候再取出来。 对象池模式的出现主要优化两点:

1、防止对象被频繁的创建和删除,从而内存抖动、频繁GC(垃圾回收)

2、对象初始化成本较高

2、操作

下面用文字的方式简介对象池的基本操作

借用: 通俗点讲就是从池中获取物体,如果是第一次获取物体要初始化池。 如果池中没有想要的物体了,则创建一个该对象

归还: 通俗点讲就是物品用完了原本是要删除的,但是应用了对象池之后则是把物体归还到池内,前提是池中数量是不大于预设的最大数量的(防止太多内存炸了),如果池中数量已经大于了预设的最大数量,则直接删除

预热: 就是预加载一定数量的对象,我个人认为这是对象池中比较精髓的部分之一。如果不做预热的,那么第一次创建对象的时候还是直接涉及初始化问题。一个很容易懂道理是玩家宁愿在加载界面多等1秒,也不会愿意在游戏中卡顿0.1秒,特别是竞技类的游戏,玩家会想砸电脑的(笑)。所以我觉得如果不做预热的对象池优化只做了一半。

缩小: 差不多就像是预热反着来,上面在归还的时候说如果大于了设定的数量阈值就不返回池中而是直接删除,但实际上删除也有可能会带来时间成本,所以我们可以先不删除,在每次游戏中途的过关之类的加载界面的时候再删除缩小内存池。如果怕在加载界面之前内存爆了的话可以多设置一个必须删除的阈值,其作用跟上面归还时写的一样。(该功能我在我的DEMO当中没有做)

重置: 每个新拿出来的物体应该和新创建的一样时“崭新”的,不能明显带有上次使用过的状态,因此再每次物体出池的时候要对可能存在后效性的地方重置。在unity中则是在物体的OnEnable()中写物体手动初始化的内容,包括清空刚体的力等等,OnEnable()和Start()的区别就是Start()只在物体第一次启用的第一帧运行,OnEnable会在每次物体重新启用的时候运行。

对象池管理器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 对象池管理器
/// </summary>
public class PoolTest : MonoBehaviour
{/*对象池的核心是集合用栈搞一个集合public Stack<GameObject> stack = new Stack<GameObject>();也可以用list搞,比较简单*/public List<GameObject> list = new List<GameObject>();//游戏预制体public GameObject GoPrefab;//对象池中的最大个数public int MaxCount=10;//对象放入对象池public void Push(GameObject go){//如果池子还能装,就往里面加,满了就不往里面加if (list.Count < MaxCount){list.Add(go);}else{Destroy(go);}}//从对象池中取出对象(返回值就要标记为GameObject)public GameObject Pop(){if (list.Count>0)//判断列表不为空{GameObject go = list[0];//如果有的话,就把第一项取出来list.RemoveAt(0);//在list中把第一项删除return go;}return Instantiate(GoPrefab);//没有的话就直接创建一个新的预制体}//删除对象池public void Clear(){list.Clear();}
}

测试代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Test : MonoBehaviour
{//用来管理没有存放在对象池中的预制体private List<GameObject> list = new List<GameObject>();void Update(){//创建对象if (Input.GetKeyDown(KeyCode.A)){GameObject go = GetComponent<PoolTest>().Pop();list.Add(go);go.SetActive(true);}//删除对象if (Input.GetKeyDown(KeyCode.S)){if (list.Count>0)//判断当前场景中是否还有对象{GetComponent<PoolTest>().Push(list[0]);list.RemoveAt(0);list[0].SetActive(false);}    }}}

将两个脚本挂到同一个空物体上
运行项目后我们可以很清楚的看到,创建出啊来的预制体被点击S键删除并没有被销毁掉,而是被放到了对象池中

unity 对象池模式相关推荐

  1. Unity对象池技术

    Unity对象池技术 https://blog.csdn.net/LemonXQ/article/details/77148886 顾名思义,对象池是存放对象的缓冲区.用户可以从缓冲区中放入/取出对象 ...

  2. 设计模式之对象池模式

    对象池模式 对象池模式, 或者称为对象池服务, 其意图为: 通过循环使用对象, 减少资源在初始化和释放时的昂贵损耗(这里的"昂贵"可能是时间效益(如性能), 也可能是空间效益(如并 ...

  3. 游戏设计模式阅读笔记18——优化模式(对象池模式)

    目录 一.意图 二.动机 三.对象池模式 四.实例代码 五.注意 1.对象和池耦合的问题 一.意图 放弃单独地分配和释放对象,从固定的池中重用对象,以提高性能和内存使用率. 二.动机 比如粒子系统的调 ...

  4. Unity对象池简单应用

    1.简单介绍 在Unity开发过程中,对象池是一种很好的能用于减少内存开销的方式.在许多场景中,比如角色射击出去的子弹,以及在游戏运行过程中频繁生成的敌人-如果在运行时实时在场景中Instance和D ...

  5. unity对象池(学习)

    对象池:   假设有一个射击游戏,那么场景中必然会创建许多的子弹.如果对于子弹只进行创建子弹-销毁子弹的流程(创建子弹-->销毁),那么可能在1S间创建很多很多的子弹,也会销毁很多子弹,对于游戏 ...

  6. Unity程序框架总结归置系列(2)——对象池

    上一篇--Unity程序框架总结归置系列(1)--单例基类 该说的,上一篇也说了.话不多说,直接开肝. unity对象池模块 先直接上源码: using System.Collections.Gene ...

  7. U3D客户端框架之类对象池技术优化C#语言GC

    一.类对象池概念 1.类对象池介绍 类对象池,类似对象池,顾名思义就是一定数量的已经创建好的类对象(Object)的集合.当需要创建对象时,先在池子中获取,如果池子中没有符合条件的对象,再进行创建新对 ...

  8. Java 中的对象池实现

    点赞再看,动力无限.Hello world : ) 微信搜「 程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. 最近 ...

  9. Unity中对象池的使用

    unity中用到大量重复的物体,例如发射的子弹,可以引入对象池来管理,优化内存. 对象池使用的基本思路是: 将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用.恰当地使用对象池,可以在 ...

最新文章

  1. 【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置...
  2. TX的8B/10B编码功能
  3. DTC跨境电商白皮书
  4. JAVA 手机号正则 工具类
  5. 最大最小背光亮度修改
  6. 简述div标签和span标签的不同,div和span标签之间的区别
  7. 智能问答:LSTM 句子相似度分析
  8. read, readline, readlines
  9. 全球计算机科学与技术排名,最新全球高校“计算机科学与信息系统”排名,哪些985表现出色?...
  10. 苹果被拒:4.Guideline 2.3.3 - Performance - Accurate Metadata
  11. 三星s8 android9.0官方rom,三星S8港版安卓9官方固件rom刷机包:TGY-G9500ZHU3DSD3
  12. 数据挖掘06-基于标准差和箱体图的单指标异常点检测【原理、数据及代码】
  13. xp系统怎样添加桌面计算机,如何为XP系统计算机设置桌面
  14. 开源中文切词工具介绍
  15. 基于机器视觉无人平台自主导航避障系统(卓翼智能)
  16. P1309 瑞士轮(C++)
  17. 小熊个人资料_抖音网红熊董事长个人资料,美迪智董事长张曼如信息介绍
  18. 倍福PLC--实现Dword数据类型每位1的计数,即统计类型中“1”的位数
  19. rhythmbox的歌词插件
  20. 2020年从放弃保研到考研上岸北航CS的3000字复习建议

热门文章

  1. 三七互娱2020春招Java平台开发工程师笔试复盘
  2. ubuntu 21.04安装教程
  3. kafka原理图简介
  4. 【图像分割】灰狼算法二维oust图像分割【含Matlab源码 2574期】
  5. vim快速选择一个单词技巧
  6. Hadoop的hadoop-config.sh脚本详解
  7. Github 项目推荐 | 科研人必看!盘点那些最好用的 AI 学术科研工具
  8. SQL语句获取表结构
  9. git回退历史版本无法上传_git回退到某个历史版本
  10. git 回退到某个版本,并推送到远程