SimpleAudioEngine使用的一些感悟

         本篇文章不赘述SimpleAudioEngine的使用方法,仅讲述使用过程中遇到的问题以及本人的解决方案。

         问题描述:基于项目需求,发射子弹时需要播放开炮的音效,声音间隔时间较短(大概200ms),打中目标会有相应的其他音效,随着项目运行时间的增加,音效丢失的问题就逐步变得明显起来,问题主要存在于Android平台。

         整理思路:由于问题主要存在与Android平台,于是乎就一步步深挖cocos2d-x关于simpleAudioEngine的java实现。首先在引擎下边发现了这货cddandroidAndroidJavaEngine(在引擎的cocos2d-x\cocos\audio\android\jni这个文件夹下)。这里边是c++调用java实现SimpleAudioEngine的一些接口说明,摸着线索继续前行,找到了cocos2dxHelper.java(位于:cocos2d-x\cocos\platform\android\java\src\org\cocos2dx\lib),打开之后就很明显了,这是java实现接口的具体调用位置,于是一鼓作气找到了位于同级目录该文件同级目录下的cocos2dxMusic.java和cocos2dxSound.java这俩货。到这儿基本就找到源头了,这两个文件里边是cocos2d-x关于simpleAudioEngine的具体java实现。今天暂且不管Cocos2dxMusic.java,咱好好唠唠Cocos2dxSound.java。

          打开看看,里边有个这东西  this.mSoundPool = new SoundPool(Cocos2dxSound.MAX_SIMULTANEOUS_STREAMS_I9100, AudioManager.STREAM_MUSIC, Cocos2dxSound.SOUND_QUALITY);这是定义了一个音效池,后边3个参数分别是这个音效池的3个属性,第一个大哥的意思是并发音频流的数量,默认值为5,这个值可以手动改大一些,从而增加并发的数量。但是,我想着重强调的是这个但是,当我把这个值设置为20的时候(我合计同时并发20个,这下大家应该都满足了吧,然而并不是。),我依旧发现随着程序运行时间的增加,还是会有一些音效播放不出来,eclipse调试发现,每次丢失音效的时候,都会有ClientPid: has over max audiotrack 16,AudioFlinger could not  create track, status: -12的错误输出,据说SoundPool最大只能申请1M的内存空间,还有说法是存储的声音不能超过5.6s,不管是哪一种,继续扩大并发音频流数量。如你所料,依旧有音效丢失,依旧有错误输出。于是乎又陷入困惑,我设置的并发音频流数量远远超过16,为什么总是输出“has over max audiotrack 16”的提示呢?!莫非是手机硬件的原因????这个问题其实最终我也没有想明白。不过有查到这样的说法:“SoundPool.load()方法返回音频id,而且这个id会因音频文件的大小而变大变小,那么一旦我们的音频文件超过int最大值,那么就会报内存错误的异常。”

        问题解决:最终我选择采用AudioEngine,放弃使用simpleAudioEngine。果然问题就这么解决了。但是不得不提的是AudioEngine在声音开到最大的时候,在有些配置较低的手机上边会有特别大的杂音,这个还需要多多测试。

        另外,注意一下LOAD_TIME_OUT这个值,系统默认为500,如果设置过大,播放没有预加载的音效时,会有不同程度的卡顿现象,如果设置的值太小,也会存在音效播放丢失的现象。因为引擎在playeffect的时候有一个这样的处理:

   synchronized(info) {
                try {
                    info.wait(LOAD_TIME_OUT);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }

    总结,声音的播放会极大程度上影响用户的体验,也会存在各种各种的问题。具体问题我们具体分析。一步一步找下去,最终肯定会找到答案,有问题欢迎一起交流。



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值