内存管理 - 加载声音效果 - Cocoa Xcode

时间:2014-10-09 22:16:31

标签: ios cocoa audio

所以我注意到我应该在我为iOS开发的小游戏中优化我加载和使用声音的方式。

我加载了一个" boing"每当我点击屏幕时发出声音并播放它,使精灵跳跃(如马里奥)。 我希望每次都能播放声音,即使声音已经从之前的跳跃播放......

以下是我目前正在使用的两种方式:

第一次实施:

   //load the music from file
   -(void)LoadMusic{
          jumpSound = [[NSBundle mainBundle] pathForResource:@"boing" ofType:@"mp3"];
   }

   //call in viewDidLoad
   - (void)viewDidLoad{
          [self LoadMusic];
          ...
          [super viewDidLoad];
   }

   //play sound when called
   -(void)playSound{
          jumpAffect = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
          [jumpAffect play];
   }

   //tap/touch to jump (& play sound)
   -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event{
          [self playSound];
          jumpUp = 16;
   }

第二次实现:,这是类似的,除了我加载相同的文件5次,并循环到下一个(所以即使它已经已经可以调用相同的声音效果在上一届会议上)。

   int soundStage = 1;

   //load the music from file
   -(void)LoadMusic{
           jumpSound = [[NSBundle mainBundle] pathForResource:@"Boing" ofType:@"mp3"];

           jumpAffect = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
           jumpAffect.delegate = self;

           jumpAffect2 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
           jumpAffect2.delegate = self;

           jumpAffect3 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
           jumpAffect3.delegate = self;

           jumpAffect4 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
           jumpAffect4.delegate = self;

           jumpAffect5 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:jumpSound] error:NULL];
           jumpAffect5.delegate = self;
   }

   //call in viewDidLoad
   - (void)viewDidLoad{
          [self LoadMusic];
          ...
          [super viewDidLoad];
   }

  //tap/touch to jump (& play sound)
   -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event{

          jumpUp = 16;

         if(soundStage == 1){
             [jumpAffect play];
             soundStage = 2;
         }
         else if(soundStage == 2){
             [jumpAffect2 play];
             soundStage = 3;
         }
         else if(soundStage == 3){
             [jumpAffect3 play];
             soundStage = 4;
         }
         else if(soundStage == 4){
             [jumpAffect4 play];
             soundStage = 5;
         }
         else if(soundStage == 5){
             [jumpAffect5 play];
             soundStage = 1;
    }

我想知道为什么更好的方法是什么?我希望避免内存泄漏,只需通过点击屏幕时连续播放相同的声音来优化它。感谢。

1 个答案:

答案 0 :(得分:0)

AVAudioPlayer同时播放多个声音,每个音频播放器播放一个声音。最好是在touchesBegan方法中加载/播放快速声音,而不保留引用:

-(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];
    jumpUp = 16;
}