cocos2d-x 音频在 Android 播放问题, preloadEffect 函数作用

原文链接:http://blog.csdn.net/zhangxaochen/article/details/8010634

一直不知道 preloadEffect 函数作用,只是猜想可能会提高程序启动效率之类的。结果今天居然碰上了用例o(╯□╰)o

看这里: http://is.gd/VoBVUJ

故事是这样的。。。

编译了一个小程序到android,其中触屏的时候会播放音效。但是程序真正运行时,第一下触屏总是没有音效,等第二下才有。当时猜测可能是音频文件加载要滞后,于是启动之后等待一段时间再触屏,可是“第二下问题”仍然存在。想来想去,不知道怎么脑袋多了根筋,突然想到了 preloadEffect 这个函数,随便试试吧。于是先预加载音效文件,果然消除了这个“第二下问题”!

个人实验证明,不管是cocos2dx 1.0-xx 版本还是直到 2.0.2 版本,如果不preloadEffect,都会出现这个问题

=================================================

个人思考:

1. 存在即合理,既然preloadEffect 这样的函数存在,那么一定是为了解决某个问题。之前一直觉得这个函数像个鸡肋,因为在 win32 上面即便是没有preload 也从来没有遇到过“第二下问题”。

2. 看了下preload 的源代码:

void SimpleAudioEngine::preloadEffect(const char* pszFilePath)
{
    int nRet = 0;
    do 
    {
        BREAK_IF(! pszFilePath);

        nRet = _Hash(pszFilePath);

        BREAK_IF(sharedList().end() != sharedList().find(nRet));

        sharedList().insert(Effect(nRet, new MciPlayer()));
        MciPlayer * pPlayer = sharedList()[nRet];
        pPlayer->Open(_FullPath(pszFilePath), nRet);

        BREAK_IF(nRet == pPlayer->GetSoundID());

        sharedList().erase(nRet);
        nRet = 0;
    } while (0);
}

大致流程就是,给要播放的文件编个号,并且如果编号不在 sharedList(),把他加到 sharedList 音效列表里面去。

不过我还是觉得“第二下问题”像个bug,因为逻辑上就算我们没有preload,就算你第一次会延迟,也至少给我放出声来啊。第一次完全不出声太奇怪了。。。

 

最后还有个问题待解决,就是不管我的手机音量多大(比如调成了静音,或者开到最大),音效的音量总是不变,似乎引擎里根本没有关联按键似的。。不明白。求助~

 

 原文链接:http://blog.csdn.net/zhangxaochen/article/details/8010634
{{OVER}}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值