Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调用新音频()的更好方法;_Javascript_Audio - Fatal编程技术网

Javascript 调用新音频()的更好方法;

Javascript 调用新音频()的更好方法;,javascript,audio,Javascript,Audio,我在浏览器中制作游戏,使用声音效果,例如快照、爆炸,对于生成的每一个类实例,都会创建新的音频对象,这消耗了大量内存,应用程序在2/3分钟后崩溃,这意味着速度变得非常慢。有更好的方法吗?也许在另一个地方创建新的音频(),但只需一次并在需要时调用它,而不是每次生成新的敌人、子弹等 例如: class Bullet extends Common { constructor() { this.element = document.createElement("div"

我在浏览器中制作游戏,使用声音效果,例如快照、爆炸,对于生成的每一个类实例,都会创建新的音频对象,这消耗了大量内存,应用程序在2/3分钟后崩溃,这意味着速度变得非常慢。有更好的方法吗?也许在另一个地方创建新的音频(),但只需一次并在需要时调用它,而不是每次生成新的敌人、子弹等

例如:

class Bullet extends Common {
    constructor() {

    this.element = document.createElement("div");
    this.audio = new Audio("./audio/LaserShot.wav");
}
在上流社会的宇宙飞船里,我每次拍摄太空时都叫它:

executeShot() {
    const bullet = new Bullet(this.getCurrentPosition(), this.element.offsetTop, this.area);
    bullet.init();
    this.bullets.push(bullet);
}

不确定这是否适用于所有场景,但您可以尝试以下代码,看看是否有效

点击
class音频服务{
构造函数(initialsetup=1){
这个。_audios=[];
对于(设i=0;i{
//如果音频为空、没有有效的url或音频已结束
//TODO:不确定这些属性是否足够
return!audio.duration | | audio.end;
});
console.log('audios',audios);
如果(音频长度==0){
const audio=新音频();
这是音频推送(音频);
返回音频;
}
返回音频[0];
}
播放音频(url){
const player=这个。_getAudioElemToPlay();
player.src=url;
player.load();
player.play();
}
}
const audioService=新的audioService();
设指数=0;
document.querySelector('.btn').addEventListener('click',function()){
索引++;
const audioList=新数组(12).填充(0).映射((值,索引)=>{
返回`https://www.soundhelix.com/examples/mp3/SoundHelix-Song-${index}.mp3`;
});
audioService.playAudio(audioList[索引%audioList.length]);
})
下面是运行上述代码的链接。 您也可以根据需要将音频更改为其他音频


我解决这个问题的主要想法是,重用创建的音频元素,使用数组来存储它,并在播放结束后重用元素。 当然,对于演示,我使用单击按钮播放音频。但肯定的是,你可以把它插入你的游戏


希望这个解决方案能对你有所帮助。如果有任何案例没有涵盖,因为我对这个领域没有太多接触,如果你能在这里发布你修改过的解决方案,那就太好了,这样我们就可以一起学习了。

你看过Web Audio API了吗?如果它对您有效,一个单一的音频可以在内存中保存给定提示的音频数据,您可以通过生成
AudioBufferSourceNode
对象来播放多次。如果您有许多不同的声音播放,这可能没有多大帮助,但如果您不断重复使用声音(许多激光镜头),这可能会有很大帮助。另一个好处是这种播放声音的方式延迟很低


我只是第一次用这个,昨天就开始用了。但我正在加载原始PCM数据(浮动范围从-1到1)。当然有办法用wav加载这个或等效的内存结构,但我对API太陌生了,还不知道如何加载。

你能提供更多信息吗,比如多个音频是否需要同时播放?是的,他们正在创建所有并行,你可以在敌人重生时射击,他们也有新的音频()在他们的构造中