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就阐述了此问题,角色播放的特效,被特效管理系统释放了。导致角色还持有。