代码之家  ›  专栏  ›  技术社区  ›  Jonas

在iPhone游戏中播放声音-慢

  •  4
  • Jonas  · 技术社区  · 15 年前

    8 回复  |  直到 15 年前
        1
  •  4
  •   catlan    15 年前

    使用NSData dataWithContentsOfMappedFile而不是dataWithContentsOfFile。

    另外,AVAudioPlayer处理自己的线程,您不需要创建线程[AVAudioPlayer play]在开始播放后返回,而不是在播放结束后返回。

        2
  •  2
  •   Andrew Grant    15 年前

    你的声音弹得怎么样?如果我要做一个猜测的话,那就是每次播放声音时,操作系统实际上是从磁盘上加载声音,同时播放声音。

    更新:

        3
  •  2
  •   Abe Pralle Abe Pralle    15 年前

    我也有同样的问题。为了解决这个问题,我首先播放并暂停声音,当它第一次加载到音量0时-这比prepareToPlay效果更好,因为prepareToPlay似乎仍然会导致速度减慢:

    player.volume = 0.0;
    [player play];
    [player pause];
    player.volume = 1.0;
    

    当需要播放声音时,我只是[播放];。然后每一个更新周期我都会循环遍历所有活动的声音,捕捉即将结束的声音并回放它们,而不是让它们过期—这样就避免了从头开始播放声音的开销和速度减慢。这里的示例在声音结束后1/15秒停止声音:

    for ({each player in active sounds})
    {
      if ((player.duration - player.currentTime) <= (1.0/15.0))
      {
        [player pause];
        player.currentTime = 0.0;
      }
    }
    

    现在可以开始下一场戏了。好像很管用!

    结果我还是得到一些暂停的第一次播放的声音。我认为在零音量播放它实际上没有什么作用,但我把它改为0.0001音量播放,然后暂停-这是听不见的,但似乎做的工作,准备的声音。

        4
  •  2
  •   MountainMath    13 年前

    -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{
        [player prepareToPlay];
    }
    
        5
  •  1
  •   Jonas    15 年前

    (在长度上使用答案而不是注释,这样我就可以显示代码):

    我的声音播放方法如下:

    - (void)playSoundThreaded:(id)soundPlayer
    {
      if(soundPlayer == nil)
        return;
    
      NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
      [(AVAudioPlayer*)soundPlayer play];
      [pool release];
    }
    
    - (void)playSound:(AVAudioPlayer*)player
    {
      if(player == nil)
        return;
    
      [NSThread detachNewThreadSelector:@selector(playSoundThreaded:)
        toTarget:self withObject:(id)player];
    }
    

    声音加载如下:

    fxPlayer = [[AVAudioPlayer alloc] initWithData:
      [NSData dataWithContentsOfFile:
        [[NSBundle mainBundle] pathForResource:@"voicehiya" ofType:@"caf"]] error:NULL];
    

    我们已经有一些线索,声音正在重新加载从磁盘每次…但不知道为什么这是或如何防止它。

        6
  •  1
  •   John Fricker    15 年前

    我觉得这条线太复杂了。试试这个:

    /* setup the sound player */
    AVAudioPlayer *player1=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL     fileURLWithPath:audioFilePath] error:NULL];
    player1.numberOfLoops = 0;
    player1.volume=1.0f;
    [player1 prepareToPlay];
    

    然后播放声音变成

    [player play];
    

    别忘了正确设置AudioSession类别。

        7
  •  1
  •   philsquared    15 年前

    为什么不直接使用AudioServicesPlaySystemSound?这非常适合声音效果。

        8
  •  0
  •   Ian    13 年前

    多亏了我工作中的一个项目,我已经调查了几天了。我在代码中添加了一些自制的评测,发现播放声音的调用在我的OpenGL游戏中导致了帧速率问题。根据我的发现,我给你一些建议:

    1. 使用AVAudioPlayer播放mp3作为背景音乐。

    2. 使用OpenAL获得你的音效。

    3. 对于声音效果,请使用apple的audio converter命令行工具将声音转换为.caf格式。这是一种未压缩格式,在将声音发送到声卡之前不需要CPU将其解压缩到内存中。它可以直接去,节省你的时间。有关使用该工具的说明,请参见 HERE . (滚动到页面最底部)

    如果我找到其他有用的东西,我会告诉你的!祝你好运!