2011-12-25 4 views
2

私は4つの異なるビープ音などいくつかのゲームサウンドを持っており、それぞれがユーザーの操作に応じて演奏されます。 4つの異なるAVAudioPlayerオブジェクトをインスタンス化する必要はありますか?個々のサウンドにはAVAudioPlayerのインスタンスが必要ですか?

また、メインプレイヤーが1つだけ必要ですか?必要なものがあれば、ファイルURLをどのように切り替えるのですか?

NSError *error; 
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error]; 

初期化するのに数秒かかるようだ:

これは私が今やっているものです。ファイルをプリロードしてそれらのファイルをすばやく切り替える方法はありますか?

答えて

2

サウンドの数だけインスタンスを作成し続けます。初期化後
、方法prepareToPlay使用:

は、そのバッファをプリロードすることにより、再生のためのオーディオプレーヤーを準備します。 ディスカッションこの方法のプリロード・バッファを呼び出すとplay方法及び音声出力の開始 を呼び出し間の遅延を最小限に再生するために必要なオーディオ ハードウェアを取得します。

stopメソッドを呼び出すか、サウンドの再生を許可する場合は、 この設定を元に戻します。例えば

:瞬間のために

NSError *error; 
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error]; 
[soundPlayer prepareToPlay]; 

、あなただけの4曲を必要とするので、これは時期尚早な最適化になります。しかし、後で必要な音の​​数が増えれば、これをすべてサブクラスでラップし、遅延読み込みを行うことができます。ドキュメントに記載されているとおり、stopメソッドの使用は、ファイルをアンロードするのと同じです。

-1

AVAudioPlayerオブジェクトをインスタンス化する必要はありませんが、これは1つのオプションです(の場合はには4つのサウンドしかありません)。

あなたはinitWithDataメソッドの代わりに、initWithContentsOfURLを(NSDataオブジェクトに事前にすべてのサウンドファイルをロードした)を使用していますが、これは事前にメモリにサウンドを読み込むことであろう作ることができます一つ。これは、あなたのサウンドフォーマットにもよりますが、ややスピードアップするかもしれません。圧縮されていないファイルは、明らかに、MP3よりはるかに高速に読み込まれます。

これでもうまくいかないのであれば、ゲームの仕事(OpenAL、Audio Toolboxなど)に適した、提供されている下位レベルのオーディオ技術の一部を見るのが最善です単純なAVVAudioPlayerよりかなり複雑です。

+0

解決策は本当に最適ではありません。私はチェックしていませんが、AVAudioPlayerがファイルの読み込みではなく、作業(解凍...)を行うことによって遅延の大部分が発生する場合、私は驚くことではありません。そして、下部レバーのソリューションは素晴らしいかもしれませんが、この状況では少し過剰です。 – Guillaume

+0

さて、私が言ったように、圧縮されていないファイルを使用すると、はるかに高速になります。 – lxt