动机
我们知道,在unity中生成和销毁一个游戏的gameobject对象是要消耗一定的资源的,频繁的生成和销毁对象内存会有很大的压力,就比如粒子系统的粒子特效、枪械发射的子弹、频繁生成的金币...等等。频繁的产生和销毁这些对象容易造成内存碎片,因此我们需要一种方式来解决这个问题,这就是对象池。
原理
定义一个对象池,对象池里面包含了可重用的一组对象,每个对象都支持查询该对象的“状态”,来确定这个对象是否是被使用中。对象池初始化时会自动创建一个字典来存储对象。
一、当你需要使用对象时:
1)如果对象池中有该对象,并且对象的“状态”不是被使用中,那么直接从集合中获取到这个对象。
2)如果对象池中没有该对像/有对象但是对象的“状态”是被使用中,那么创建一个新的对象并加入集合中,然后返回这个新建的对象。
二、当你需要销毁对象时:
1)直接将对象的“状态”设置为未使用。
使用时机
对象池广泛应用于可见的事物上,比如游戏实体和视觉效果, 但是它也可在不那么视觉化的数据结构上使用,比如正在播放的声音。 在以下情况中使用对象池:
- 需要频繁创建和销毁对象
- 对象大小相近
- 在堆上进行对象内存分配十分缓慢或者会导致内存碎片。
- 每个对象都封装了像数据库或者网络连接这样很昂贵又可以