[分享]微信小游戏声音资源批量加载卡住,临时解决方案

先说我这边的开发环境,现象和解决方法,有兴趣的可以继续看看关于问题的分析和推测,虽然不一定对。
 
环境: LayaAir TS版 1.7.21库,微信调试库2.3.0, 三星A9,安卓 8.0
 
现象: 批量加载多个声音文件的时候,偶尔会出现卡住一动不动的现象,重新打开小游戏后能恢复,而且只在真机出现,在微信开发者工具内无法重现。
 
解决方案:
       1 在laya.wxmini.js的MiniSound类中,增加函数
 
       
    __proto.resetPlay=function(){
this._sound.stop();
this._sound.volume = 1;
this._sound.offPlay();
}

 
       2 在MiniSound类的onDownLoadCallBack函数中,
this._sound.onError(MiniSound.bindToThis(this.onError,this));
          这一句的后面,增加如下语句:
this._sound.volume = 0;
this._sound.onPlay(MiniSound.bindToThis(this.resetPlay,this));
this._sound.play();
        3 在MiniSound类的onCanPlay和onError函数中,增加这一句 this.resetPlay();
 
        我也把改过的js文件上传了,但这是1.7.21的,其他版本可以自行参考修改。
 
 
关于问题的分析和推测:
       我使用console.log一步步调试,最终发现是MiniSound的onCanPlay没有被调用,也就没有complete事件触发,同样的error事件也没有触发,于是就卡住了,触发不了批量加载全部完成的回调。
       我猜测,是微信的InnerAudioContext实例,在设置了src属性之后,并不是都会立即开始预加载,并触发onCanplay回调,而onError回调也只是在播放失败的时候才会触发,因此我增加了play方法,播放成功的话它会触发onCanplay回调(实际运行看起来是的),而如果失败了,也会触发onError回调,这样就不会卡住了。
       但这个方案还存在一个问题。虽然在调用play之前,设置了音量为0,之后再恢复,但是对于IOS,好像静音没有起到效果,还是会放出声音来,这个需要继续研究下。
 
以上只是个人的观点,不代表官方,如果你碰到了同样的问题,用这个方法能够解决的话,很高兴能帮到你^_^
已邀请:

laya_Aaron

赞同来自:

感谢分享~!

要回复问题请先

商务合作
商务合作