我已阅读 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/