发布音频 - Cocoa Xcode(内存管理)

时间:2014-10-10 00:42:10

标签: ios xcode cocoa audio

所以在我之前的问题FOUND HERE中,每当我在我的iOS游戏中跳过精灵时,我都试图找到播放“跳跃”声音的最佳方式......

由于某种原因,我已经开始担心我正在加载音频文件数百万次并浪费内存:(

Anywho,以下内容已经向我推荐了,(所以每当我通过点击屏幕跳转,声音都会加载并播放)...

    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event
    {
            //NSString *
            jumpSound = [[NSBundle mainBundle] pathForResource:@"boing" ofType:@"mp3"];

            //AVAudioPlayer *
            jumpAffect = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];

            [jumpAffect prepareToPlay];
            [jumpAffect play];

            //then, make sprite jump
            jumpUp = 16;
    }

上面的方法允许我快速按下跳转并重新启动音频循环,即使前一个循环(来自上一个跳转)尚未完成。

值得记住的是,这可能会发生在每分钟数百次(或者更实际的是每秒几次)......

这是一个问题吗?完成方法/游戏循环后是否需要释放曲目?

1 个答案:

答案 0 :(得分:0)

我认为你的最后一个问题是完全错误的。 AVAudioPlayer对游戏有太多的延迟。当你跳跃时,声音可能会在一秒钟后发生,而不是在你想要的时候发生。如果你不想每分钟播放一百万次声音,你应该使用AudioServices:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
     NSURL *pathURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"boing" ofType:@"wav"]];

     SystemSoundID audioEffect;
     AudioServicesCreateSystemSoundID((__bridge CFURLRef) pathURL, &audioEffect);
     AudioServicesPlaySystemSound(audioEffect);
     //then, make sprite jump
     jumpUp = 16;
}

你必须将你的mp3转换为wav或caf。但我认为这种权衡是值得的......