频繁的音频占用太多的CPU - JavaFX



我正在尝试在JavaFX中开发一个塔防。我的游戏运行得很好,即使有许多炮塔和敌人,但当我开始为塔射击使用音效时,性能在短时间内显著下降。我试过用不同的方法。

public void shotSound() {
this.mediaPlayer = new MediaPlayer(this.hit);
this.mediaPlayer.setVolume(0.1);
this.mediaPlayer.play();
this.mediaPlayer.setOnEndOfMedia(() -> {
this.mediaPlayer.stop();
});
}

这是声音效果的方法。我甚至尝试过调整音频的持续时间,但无济于事,它仍然是滞后的(当我的炮塔使用音频时,cpu使用率飙升,随着时间的推移,游戏变得不可玩)。所以我在问是否有更好的方法来播放频繁的声音,音频文件当然比射击的执行时间要短。我的炮塔在1秒内发射4次,我的音频文件的长度大约是100毫秒,所以这应该不是问题。

我错过了什么吗?如有任何建议,我将不胜感激。

每次射击初始化一个新的MediaPlayer是非常低效的。正如@Slaw在评论中所说,AudioClip是一个更好的选择。只要确保你提前设置好你的声音:不要每次你想播放它时都初始化AudioClip

使用AudioClip的一个重要好处是您可以多次调用它,同时播放声音。这是一个很大的优势,如果这种情况是为战斗中的枪击或激光爆炸提供线索。此外,AudioClip允许你以不同的频率播放,所以你可以以稍微不同的速度播放相同的声音效果来模拟许多不同的武器爆炸,所有这些都有一个单一的线索保存在内存中。

JavaClip类似于AudioClip,因为声音保存在内存中,并且可以重放。但它不支持并发播放或不同音高的播放。我编写了一个名为AudioCue的小库,它允许并发播放,具有实时平移和音高变化,还包含一个可以在声音结束时触发的监听器。但它只支持16位44100fps的wav文件。我对四种不同的类似剪辑的选项做了一个小的比较图表。

最新更新