正在播放的声音在JavaScript性能沉重?(Is playing sound in Javasc

2019-09-16 10:29发布

我做在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被调用),有一个停顿持续将近半秒! 起初,我认为问题是在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;

和滞后回来了! 现在,我敢肯定,播放声音会引起问题。 我对么? 这究竟是为什么? 我如何解决它?

Answer 1:

我就遇到了这个相同的延迟问题发出任何声音当玩家触发的武器。 我的解决办法是两个:

  1. 播放每个声音在加载时,然后立即暂停。 这将允许它继续打快,而不是从头播放。 声音的每场比赛后这样做播放暂停技术。

  2. 使用池<audio>对象的每个声音,而不是为每个声音类型的单个音频对象。 而不是仅仅使用sounds[id]使用2D阵列,其中访问sound[id][count] 在这里, sound[id]是所有具有相同的声音频对象的列表,并count是当前对象的使用了声音ID的索引。 与每个调用playSound(id)递增与该ID相关联的计数,以便在下一次调用调用一个不同的音频对象。

我不得不同时使用这些,因为播放暂停技术确实缓冲延迟移动之前需要播放声音的一个很好的工作,但是如果你需要的声音迅速,你仍然会得到延迟。 通过这种方式,最近使用的音频对象可以“充电”,而另一个对象播放。



Answer 2:

有两件事情可以帮助你是要么利用网络工作者或预先计算提前响度的几个层次,您也可以做与工作线程的背景。 我说这个没有进入网络音频API或如何计算你的声音输出的特点,但如果你已经用尽了所有其他方法,这可能是你应该专注于下一个方向。



文章来源: Is playing sound in Javascript performance heavy?