21.UniRx专题(ObjectPool和AsyncObjectPool对象池子)

本文详细介绍了对象池子的概念、在Unity开发中的应用,以及如何使用UniRx库实现对象池,包括基本和高级用法。还讨论了UniRx对象池的多线程支持,并提及了AsyncObjectPool在异步初始化对象池时的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是对象池子,什么情况下使用
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);
        });

        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值