Java(Java声音): Is "clip.play()" an expensive call?

标签 java multithreading performance jvm javasound

我已阅读 here在 StackOverflow 上,每次您在 JavaSound 中播放剪辑时,它都会在幕后创建一个线程来播放它。如果这是真的(如果不是,请告诉我,因为我没有找到任何相关的文档/来源),它是否会被视为昂贵的调用,因为在任何操作系统/JVM 中创建线程都是一项昂贵的任务?我还不确定,但我可能需要同时播放 10 到 20 个剪辑,所以我想知道这是否会成为问题。

PS:如果除了创建线程之外还有其他原因导致调用异常,请告诉我。

最佳答案

线程并不昂贵,尤其是。我亲自编写了一个运行次数超过 500 次的程序。服务器程序可以产生更多的东西。

声音处理并不便宜,但我不知道它比许多图形效果(例如 3D 中的灯光)更消耗 CPU 资源。我制作了一个程序,既可以播放声音,又可以制作一个“发光球”,在播放声音时它会变大和变暗。 “发光球”不断更新 RadialGradientPaint 来实现这种效果。我遇到了大约 10 个球和声音的上限,而图形球的处理负载更大。

不过,在播放 17 个剪辑的情况下,您可能无法做很多其他事情。您必须对其进行测试,如果 cpu 跟不上,您将会听到丢包的声音。

您的 17 个剪辑可能会占用大量 RAM。您知道它们都已加载到内存中,是吗?每秒 44100 个样本,通常每个样本 4 个字节(立体声、16 位 PCM),数量开始快速增加。

因此,可能有理由考虑使用 SourceDataLine,尤其是对于较长的声音。

此外,似乎某些操作系统不能很好地处理多种声音。我在使用 Linux 时尤其遇到过问题。我最终编写了一个程序,将所有播放的声音混合到一个输出 SourceDataLine 中,作为处理此问题的一种方法。

提高效率的另一种方法是加载我自己定制的剪辑。我为该剪辑提供了多个可以独立移动音频数据的光标(指针)。这样,我可以多次(以不同的速度)重叠播放剪辑。要使用 Java Clip 执行此操作,您必须将其多次加载到 RAM 中。所以,你可能会考虑写一些类似的东西。多个光标的输出可以通过 SourceDataLine 进行求和和播放。

关于Java(Java声音): Is "clip.play()" an expensive call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11456622/

相关文章:

java - 如何等待一段时间,然后才返回默认值?

python - python x=x+x 比 y=x+x 慢 120 倍?!为什么?

javascript - 匿名函数存储效率

java - 如何更改卡片 View 的背景颜色?

Java:将字符串表示解析为树表示

java - jbyteArray 和 jbyte 指针的区别

java - 知道谁锁定了对象

Java - 清除其他 JList 中的选择

multithreading - 编写搜索引擎

python - numpy 和 matlab 之间的性能差异