最近、小さなゲームを完成させ、それにオーディオを追加しようとしています。現在、私が持っているサウンド システムは動作しています (基本的に、ここでの一番の回答と同じコード です)。それは速いゲームなので、もっと速いものを探しています。私はスレッドの経験がありませんが、ここで適用できますか?
4 に答える
コンテンツをオーディオ形式で再生するたびにファイルを読み取る代わりに、ファイルを一度バイト配列に読み取ってから、そのバイト配列からオーディオを読み取ります。
public static byte[] getBytes(String file) {
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] bytes = new byte[(int) raf.length()];
raf.read(bytes);
return bytes;
}
次に、playSound
バイト配列をパラメーターとして受け取るようにメソッドを変更し、それらをSourceDataLine
インスタンスに書き込んでサウンドを再生することができます (元のメソッドで行われているように、書き込みの直前にファイルから読み取ります)。 .
これらの既存の回答の1つを受け入れたいのと同じくらい、私は簡単な方法で問題を解決しました。初期化中に参照されたすべての変数をロードすることによりFile
、ゲームプレイ中のどの時点でも遅延が発生することはありません。ただし、これがこの質問を見ている他の人にとって適切な解決策でない場合は、Vulcan の回答もお勧めします。
File を渡す代わりに、オーバーロードされたメソッド AudioSystem.getAudioInputStream() に BufferedInputStream を渡すことができます。
への呼び出しdrain
はブロッキングであり、観察される遅延が発生します。そこで待つ必要はありません。ただし、サウンド出力を他のコードと並行して動作させる場合は、サウンド バッファーに大量のサウンドがあり、さらにキューイングしている場合にどうなるかを定義する必要があります。メソッドと API の残りの部分について学びavailable
、サウンド カードを柔軟に管理し、「音の遅れ」の影響を受けないようにします。
この目的でスレッドを使用することもできますが、ここでは必要ありません。並列プロセスの役割は、サウンド ドライバー自体が適切に果たすことができ、シングル スレッド アプローチにより、アプリケーションの設計とデバッグが容易になります。