AssetBundle卸载Audio资源导致不能播放的坑

最近项目准备上线,发现场景切换资源卸载后。再也不能播放。一直找不到原因。后打断点,然后通过提示终于在百度找到一篇帖子。这里特意转过来。扩散一下。

以下为转帖原文:

坑之前序

AssetBundle下加载音频后立即调用Unload(false),会造成音频播放不出来,且会无限等待

 

坑之原因

大家都知道,AssetBundle的内存消耗机制,为了最大程度的降低内存的消耗,一般当一个AssetBundle不可能被其它AssetBundle引用时,当LoadAsset之后,就可以直接调用AssetBundle.Unload(false)来清掉bundle所占用的内存

音频资源我都是采用动态加载并播放的,没有直接挂载的情况,而且都是一个音频一个bundle,所以它不存在依赖或多个打在一个bundle里面的问题,我用的的代码如下

1473426316_5648

但是这样会造成音频会播不出来,因为LoadAsset并不等于Load了完整的音频,它还需要依赖AssetBundle进行异步的音频硬件解码!

经测试,当你把它Unload(false)后,它并不会报错,而是会一直无限期等待,且永远处于AudioDataLoadState.Loading状态,因为没有播放,也就没办法释放这个Asset资源,当你的音频加载过多后,就会造成内存泄漏!

注:并不是所有音频都会播不出来,那种解码时间长的会播不出来,解码时间一瞬间完成的可以正常播放,经测试所有音频,在LoadAsset之后一到两帧可以解码完成

坑之修复

AudioClip里面有一个状态来指示它是否加载完成,所以我们只需要等待它加载完全后再去Unload(false)并播放就可以了,代码如下:

1473426391_3903

 

 


以上为原贴内容。转载至:

http://blog.csdn.net/gz_huangzl/article/details/52490447

本文链接:

https://www.bobsong.net/1142.html
1 + 1 =
快来做第一个评论的人吧~