6

私は音楽ゲームを作っています。ユーザーが音符を押すと音が出ます。ユーザーがボタンを押すとすぐにサウンドが再生される必要があるため、ユーザーは音楽に間に合っているかどうかを判断できます。ただし、特にノートプレスが速くなると、音が遅れているように感じます。

バックグラウンドの .m4a 音楽ファイルは AVAudioPlayer で再生されます。currentTime プロパティにアクセスできるので、Cocos Denshion よりもこれを使用することにしました。私は間違っているかもしれませんが、CocosDension でこれにアクセスできるとは思いません。

非常に短い (1 秒未満) .wav ファイルを作成しました。init で効果音をプリロードします。

[[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

次に、効果音を再生するために、CCTouchesBegan で次のように呼び出します。

[[SimpleAudioEngine sharedEngine] playEffect:@"Assist.wav"];

その後、コードを呼び出してユーザーのタイミングを決定し、ポイントを授与します。遅れている理由、または音楽に合わせて効果音を再生するより良い方法はありますか?

編集:最近、いくつかのことを試しましたが、結果はありませんでした。まず、曲の適切なタイミングで音を鳴らしてみました。まだラグがあったので、タッチイベントが遅いとは思いません。また、3 つの異なるサウンド ライブラリを試しました。

しかし、シミュレーターで走ってみると、ラグがないように見えました。誰にもアイデアはありますか?私は無知で、その主要な機能を本当に理解することはできません...

4

3 に答える 3

1

このコードは避けるべきです:- [[SimpleAudioEngine sharedEngine] preloadEffect:@"Assist.wav"];

アプリの起動時に、次のコードを記述してフレームワーク SimpleAudioEngine をロードする必要があります:-

//SimpleAudioEngine *palySound; .h ファイルにオブジェクトを作成しました。palySound=[SimpleAudioEngine 共有エンジン];

サウンドを再生したいときはいつでも、次のように記述できます。 [palySound playEffect:@"Assist.wav"];

于 2012-01-09T11:49:26.657 に答える
0

で何をしているのかわかりませんが、私自身の経験では、サウンドの再生に遅れが生じないようにする最善の方法は、サウンドファイルごとSoundEngineにを割り当てることです(AudioQueueをいじり始めたい場合を除く)。AVAudioPlayer

ここに例があります:

現在のViewControllerにが含まれていると仮定しますAVAudioPlayer *assistPlayer;

あなたviewDidLoadのサウンドでそれを初期化します:

NSURL *wavURL = [[NSBundle mainBundle] URLForResource:@"Assist" withExtension:@"wav"];
assistPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:wavURL error:nil];

次に、IBActionファイルを再生したい場所で、次の手順を実行します。

[assistPlayer play];

遅れてはいけません。

于 2012-02-17T14:36:42.183 に答える
0

フィンチを試しましたか?低遅延でサウンドを再生すると主張しており、OpenAL の単なるラッパーでもあります。

それ以外は、私は実際に OpenAL の経験がありませんが、遅延の原因として 2 つの可能性を考えることができます。

  1. メイン スレッドがビジー状態です - メイン スレッドから他のスレッドに作業をオフロードしてみてください。

  2. おそらく、OpenAL は大きすぎるバッファーで定義されているため、パイプラインはサウンド全体 (またはその大きなチャンク) をバッファーにロードし、その後でのみ再生が開始されます。

于 2012-02-19T21:08:06.580 に答える