对象放回对象池时候的注意点

1、声音播放缓冲池问题
在这里插入图片描述
这里的RuntimeStudioEventEmitter是class。
其中_emitter1是类的成员,他的本意是,将不用的emitter还回到池子里。
但是如果不是ref传递的,如下:

      public void Destroy()
    {
        DestroyEmitter(_emitter1);
        DestroyEmitter(_emitter2);
        DestroyEmitter(_emitter3);
        DestroyEmitter(_emitter4);
        DestroyEmitter(_emitter5);
        DestroyEmitter(_emitter6);
        DestroyEmitter(_emitter7);
        DestroyEmitter(_emitter8);
        DestroyEmitter(_emitter9);
        DestroyEmitter(_emitter10);

        eventName = "";

        cachedGo = null;
        cachedRigidBody = null;
        m_fmodID = 0;
    }
    public void DestroyEmitter(RuntimeStudioEventEmitter emitter) //此地方非引用传递,会导致传入的遍历未赋为null
    {
        if (emitter != null)
        {
            emitter.Stop();
            ReturnEmitter(emitter);
            emitter = null;
        }
    }

此时_emitter1到_emitter10,都依然指向的池子里中的对象。这就很危险,因为下次从池子再拿出来的赋值给另一个引用的之后,这样就会有两个地方同时使用这个对象,这个会导致老的声音,突然被停止了。所以,必须是引用传递。

2、特效播放的时候缓冲池问题
我的本意是特效创建一个全局的比如保存在XEntity中的m_moveSfx,再角色销毁的时候自己释放。但是由于特效内部代码的原因,它会在update中检测这个特效播放完毕,如果播放完毕了,会自动释放,放回池子中。
那么此时m_moveSfx并未赋值为null,它指向了池子中的对象。
所以归结为两点:
1.确保释放是真正释放,也就是放回池子中的对象,无任何外部对象引用它。问题1阐述了此问题,未真正释放,类成员依然持有。
2.谁申请,谁释放。问题2就阐述了此问题,角色播放的特效,被特效管理系统释放了。导致角色还持有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值