我有一些游戏声音,例如四种不同的嘟嘟声,每个都会根据用户执行的动作进行播放。我是否需要实例化四个不同的AVAudioPlayer
个对象?
或者我只需要一个主要播放器?如果我只需要一个,那么如何切换文件URL?
这就是我现在正在做的事情:
NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];
但似乎需要几秒钟来初始化。有没有办法预加载文件并快速切换它们?
答案 0 :(得分:2)
继续创建与声音一样多的实例
初始化后,使用方法prepareToPlay
:
通过预加载缓冲区来准备播放音频播放器。 讨论调用此方法可预加载缓冲区并获取音频 播放所需的硬件,最大限度地减少了呼叫之间的延迟
play
方法和声音输出的开始。调用
stop
方法,或让声音完成播放,撤消 这个设置。
例如:
NSError *error;
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error];
[soundPlayer prepareToPlay];
对于那些时刻,你只需要4首歌曲,所以这将是过早的优化。但是如果以后,你需要的声音数量会增加很多,你可以将所有这些包装在一个子类中并进行延迟加载。正如文档所述,使用stop
方法相当于卸载文件。
答案 1 :(得分:-1)
您不一定需要实例化四个不同的AVAudioPlayer
对象,尽管这是一个选项(如果仅有四个声音,这可能是最简单的。)
您可以提前将声音加载到内存中,您可以使用initWithData
方法而不是initWithContentsOfURL
(将所有声音文件预先加载到{ {1}}个对象)。这可能会略微提高速度,但这也取决于您的声音格式。例如,未压缩的文件显然比MP3快得多。
如果这仍然不适合你,你最好的选择是看一些提供的低级音频技术,它们更适合游戏工作(OpenAL,音频工具箱等),但这些是比简单的NSData
更复杂。