音效文件的缓存处理,会导致Audio Instance超出上限,从而播放新的音效会突然将前面还在播放的音效中断吗?

  • Creator 版本: 2.4.0

  • 目标平台:小游戏微信平台

  • 重现方式:如标题描述

  • 首个报错: 没有报错

当前项目对音效文件的处理是:
1.有部分的音效文件预加载放在了auidoPool中
2.剩余的其他短暂的,不太影响体验的音效,是通过cc.resources.load口去加载,播放后,同样缓存在了audioPool中
3.所有缓存在audioPool中的音效文件都没有释放(主要是考虑,如果释放的话,那就没必要做audioPool缓存了,而且绝大部分的音效调用都很频繁)

出现问题:

在微信小游戏平台,当游戏进行到一定时间的时候,当一个播放一个音效的时候,假如此时有背景音效正在播放,会出现以下问题:
a.正在播放的音乐/效,突然音量降低,但是很快恢复
b.正在播放的音乐/效,会突然被终止,去播放新的音效了

当然这种情况不是一进入游戏玩的时候会出现,只是会在玩了一定时间之后,出现

目前主要是希望官方引擎组能够指点下迷津,如果是微信环境的问题,那我们开发组就不在这个问题上纠结了

有大佬们遇见这个问题吗

我记得前两年遇到这个问题的时候,IOS和安卓表现还不一样,当初也是没解决

原来是个时间久远的顽强问题了吗Snipaste_2020-12-14_10-59-55

有试过安卓吗?我印象中安卓没问题。
两年前我刚入行,技术力很差,所以也不敢说是顽强问题还是咳咳自己太菜

还没,因为我们项目主发小游戏的平台,这个问题几个月之前就发现了,当时是暂时处理了下,比如释放音效资源,最近上线之后,反馈的这个问题越老越多了,就来论坛提问了


在论坛其他看似有关联的帖子中,找到了似乎是有联系的回答,难道是因为音频的实例超出了设定的限制,所以新的音频会替换掉最早的音效吗?现在项目内音频文件都是mp3格式的,总量一共60多,其中bgm类型2个,剩余都是短音效,音乐与音效的播放,都是用的同一个接口:cc.audioEngine.play(“audioUrl”),有个别的音效文件做了预加载,播放过的音效在audioMgr中按照url做了缓存,也就是:audioPool[url] = audioClip 这种,下次再次播放这个音效就会直接从缓存的pool中拿,缓存的音效文件都没有释放,会因为是这个原因导致的吗

@zhefeng.zhang

@EndEvil @jare 谢谢了,非常感谢

在任何平台,都有一个音频播放的最大实例,比如Android好像是32,微信小游戏文档上也有写,他支持的最大实例数更少,具体多少忘记了
超出这个我记得是不会再播放,也可能是我记错了,会停止前边的
总之,不是你那个audioPool的问题

1赞

那就好了,不过对于音频播放最大实例,通过对文档的理解,我个人还是有些疑惑,比如我通过cc.audioEngine.play (playMusic / palyEffect)等接口播放了一个音频文件之后,是否此时就已经是一个实例了,那么当这个音频文件被我缓存在audioPool中之后,下次调用audioEngine接口再次播放这个同样的音频文件的时候,还会创建一个新的实例吗?

音频文件被我缓存在audioPool中
这只是占用内用而已,不属于占用音频实例
确切的说是,播放实施,也就是正在播放的音频句柄

音频数量播放超过上限了,目前的策略确实是会停掉最早播放的音频,这个是平台的限制
现在的实现还没有能够提供音频优先级的控制,所以有时候可能会出现 新的音效 把背景音停掉了

这个可能还需要开发者留意一下,我们在 3.0 处理下这个问题,尽量避免 音效 把背景音停掉的情况

好的,多谢大大回复

好的,多谢大佬指点迷津

let audioId = cc.audioEngine.playEffect(clip, loop);

            cc.audioEngine.setFinishCallback(audioId, () => {

                cc.audioEngine.stopEffect(audioId);

  })

最后还是这个处理比较合适,播放完,就停止当前这个id

2赞

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。