3

私はJavascriptで簡単なゲームを作成しています。このゲームでは、オブジェクトが壁に衝突すると、「どろどろ」の音が鳴ります。その音のラウドネスは、オブジェクトのベロシティによって異なります(ベロシティが高い=>サウンドが大きい)。

再生機能:

playSound = function(id, vol) //ID of the sound in the sounds array, volume/loudness of the sound
{
    if (vol) //sometimes, I just want to play the sound without worrying about volume
        sounds[id].volume = vol;
    else
        sounds[id].volume = 1;

    sounds[id].play();
}

私の呼び方:

playSound(2, Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV); //self.TV stands for terminal velocity. This calculates the actual speed using the basic Pythagora's theorem and then divides it by self.TV, which results in a number from 0 to self.TV. 2 is the id of the sound I want to play.

Chromeでは、物事は非常にうまく機能します。ただし、Firefoxでは、壁との衝突が発生する(=>が呼び出される)たびに、playSound約0.5秒続く一時停止があります。最初は問題があると思っていましたがMath.sqrt、間違っていました。これが私がそれをテストした方法です:

//playSound(2, 1); //2 Is the id of the sound I want to play, and 1 is max loudness
Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;
Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;
Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;

これにより、衝突の遅れが完全になくなり、Math.sqrt問題はまったく発生していないと思います。念のために言っておきますが、私はこれを行いました。

playSound(2, 1); //2 Is the id of the sound I want to play, and 1 is max loudness
//Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;
//Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;
//Math.sqrt(p.vx*p.vx + p.vy*p.vy)/self.TV;

そして、ラグが戻ってきました!今、私は音を演奏することが問題を引き起こすと確信しています。私は正しいですか?なぜこうなった?どうすれば修正できますか?

4

2 に答える 2

7

プレイヤーが武器を発射したときに音が鳴るのと同じ遅延の問題に遭遇しました。私の解決策は2つありました。

  1. ロード時に各サウンドを再生し、すぐに一時停止します。これにより、最初から再生するのではなく、すばやく再生を再開できます。サウンドを再生するたびに、この再生一時停止テクニックを実行します。

  2. <audio>サウンドタイプごとに1つのオーディオオブジェクトではなく、サウンドごとにオブジェクトのプールを使用します。を使用する代わりにsounds[id]、でアクセスする2D配列を使用しますsound[id][count]sound[id]これは、すべて同じサウンドを持つオーディオオブジェクトのリストであり、そのcountサウンドIDに使用されている現在のオブジェクトのインデックスです。を呼び出すたびにplaySound(id)、そのIDに関連付けられたカウントをインクリメントして、次の呼び出しが異なるオーディオオブジェクトを呼び出すようにします。

再生一時停止の手法では、サウンドを再生する前にバッファリングの遅延をうまく移動できるため、これらを一緒に使用する必要がありましたが、サウンドをすばやく必要とする場合でも、遅延が発生します。このようにして、最近使用したオーディオオブジェクトは、別のオブジェクトの再生中に「再充電」できます。

于 2012-04-09T19:36:59.180 に答える
0

Webワーカーを利用するか、事前にいくつかのレベルのラウドネスを事前に計算することで役立つ可能性のある2つのことは、ワーカースレッドを使用してバックグラウンドで実行することもできます。これは、WebオーディオAPIの特性やサウンド出力の計算方法に立ち入ることなく言っていますが、他のすべてのアプローチを使い果たした場合は、これが次に焦点を当てるべき方向かもしれません。

于 2012-04-09T19:42:46.733 に答える