本文仅在阐述对象池模式的思想,而非代码层面上的保姆级解释。请配合其他大佬的代码一起食用。
PS:笔者为Unity程序员,部分方法为Unity中的方法
1.为什么要引入对象池模式?
在游戏开发中,我们经常会遇到以下场景:
1.对象的大量创建和销毁,比如子弹。
2.场景中存在大量相同物体的创建和销毁,导致性能下降。
这两个场景本质上一回事,他们面对的问题就是:如何创建销毁物体且保持性能?
———————————————————————————————————————————————————————
在Unity中,使用Destroy();或者是SetActive(false);来控制对象的销毁,但是前者是真的没了,后者就还在,但是状态激活为false。
我们以音游的砖块为例来详细讨论:
这里的音游,可以用别踩白块,节奏大师。
- 砖块需要被点击消除,砖块在到一定区域后,自动被消除。
- 砖块有碰撞体,有绑定的脚本,需要传输的值。(点击砖块后,判断连击,增加分数)
因此,对于砖块的创建和销毁,如果单纯的生成一个砖块,销毁一个砖块,那么势必会造成性能上的损耗。
2.对象池模式的基础模型
重点:对象池模式,顾名思义,就是个池子。池子里面是对象。当我们要使用对象池中获取一个对象的时候,对var的对象进行“赋值”,赋予它该需要的组件。当这个对象被销毁的时候,重新进入池子,卸载所有组件,重新变成var。
首先我们写两个脚本:Pool.cs Brick.cs
分别是挂载到对象池和砖块上。
Pool.cs我们着重要讲得就是获取
——————————————————————————————————————————————
如何从池中获取对象池?
这里的方法有很多,主要思想就是队列,list,数组等等
1.在生成对象后,让对象进入队列
2.调用队列的Dequeue();
如何生成对象
没啥可说的,for循环,硬生成。然后添加对象就好了
1.for循环生成,然后进入队列
2.进入队列的时候,使active为false
如何返回池子
引入队列的缘故,所以直接使用队列的方法就行了。让对象返回队列就OK
1.调用Add();
2.设置active为false
——————————————————————————————————————————————
总结:
对象池模式相对来说比较简单和常用。理解模型就好,相关代码在很多博客上都能找到。