什么是对象池子,什么情况下使用
Unity开发当中池子的概念一般化
UniRx的池子:基本编码使用方式
UniRx的池子:高级使用方式
UniRx对象池子多线程支持
AsyncObjectPool
什么是对象池子,什么情况下使用
在我们的过程过程中,经常会遇到一种特殊的情况;需要多次复用同一个prefab的游戏物体,
比如发射的子弹,SLG中的士兵,伤害数字等;如果每次进行实例化,会加大程序的运行力度;
假如一次性实例化,保存到内存里面,通过复用来优化程序运行的压力和节省内存资源,
则可以使用对象池子。
Unity开发当中池子的概念一般化
由于Unity开发的App运行占据的内存高,特别在早些年手机内存不足几个G的时候;容易出现闪退的现象,
一般使用池子来优化内存,复用实例化的prefab游戏物体来满足需求;也叫内存池子。
UniRx的池子:基本编码使用方式
创建自己的ObjectPool派生
使用pool来实例化
功能截图
代码示例
public class UniRxObjectPool : ObjectPool<Transform>
{
// 需要池子的prefab
private GameObject mPrefab;
public UniRxObjectPool(GameObject prefab)
{
this.mPrefab = prefab;
}
protected override Transform CreateInstance()
{
var gameObj = Object.Instantiate(mPrefab);
return gameObj.transform;
}
}
public class No21_ObjectPool : MonoBehaviour
{
[SerializeField]
private GameObject mPoolPrefab;
[SerializeField]
private Button mBtnSpawn;
[SerializeField]
private Button mBtnShrink;
void Start()
{
UniRxObjectPool pool = new UniRxObjectPool(mPoolPrefab);
mBtnSpawn.OnClickAsObservable().Subscribe(_ =>
{
var poolObj = pool.Rent();
Observable.TimerFrame(30).Subscribe(f => pool.Return(poolObj));
});
mBtnShrink.OnClickAsObservable().Subscribe(_ =>
{
// 手动回收对象池子, 第一个参数是回收比例,第二个参数是保存最小数量
//pool.Shrink(0.6f, 1);
// 自动回收对象池子,3秒检查一次进行回收
pool.StartShrinkTimer(TimeSpan.FromSeconds(3f), 0.6f, 1);
});