サウンドを鳴らしてます

 AVAudioPlayerを使ってます。
 ゲームでサウンドを鳴らす時ですが、そのまま演奏開始すると、
ゲームだとその瞬間ガクっと処理落ちする事があります。


 どうもplay開始時の負荷が高いようです。
 そこで、別のスレッドにして呼び出すようにしています。


[NSThread detachNewThreadSelector:@selector(play) toTarget:self withObject:nil];


 全体負荷は変わらないのですが、ゲームの方のスレッドの負荷は分散され、
描画がガクっとなるのはやや防げます。
 副作用は音がなるタイミングがちょっとズレる事。
 完全に同期されたい方は、Audio Unitがお勧めです。
 (私はiOS4マルチタスクでの復帰時にAudio Unitがうまく復帰させられず、ちょっと挫折中orz)


 その他の処理負荷軽減です。

  1. 同じ効果音を演奏中に再度鳴らす時は、playを使わずcurrentTime=0;で頭から再生しなおす
  2. サウンドにグループ(チャンネルみたいなもの)とプライオリティを設けて、同時発声数を制限して処理負荷を軽減


 同じグループが演奏中なら演奏中の音と新たに演奏する音のプライオリティを比較して、
同じか高いなら前の音を停止して、後の音を演奏する、という手法です。


 処理負荷軽減ではないのですが、曲を急に切り替えると、つなぎ目でノイズのように聞こえる事があります。
 そこでAstro Zillでは、短めのフェードアウトしてから次の曲をリクエストするようにしました。
 自然につながるようにする為の処置です。(気付いた方がいらっしゃったら嬉しいな)


 サウンドのリクエスト、奥が深く、まだまだ納得が行っていないのですが、スキル不足です。
 勉強しながら試行錯誤してやっています〜。


 iPhoneサウンド関係、こちらの書籍がとても詳しいです。役に立ちました〜。