原文链接: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}}