我在StackOverflow上读到过here,每当你在JavaSound中播放一个剪辑时,它都会在幕后创建一个线程来播放它。如果这是真的(如果不是,请告诉我,因为我还没有找到任何关于这方面的文档/来源),它会被认为是一个昂贵的调用吗,因为在任何OS/JVM中创建线程都是一项昂贵的任务?我还不确定,但我可能需要同时播放10到20个剪辑,所以我想知道这是否会有问题。
PS:如果这是一个显式调用,除了创建线程之外还有其他原因,请让我知道。
发布于 2012-07-14 03:04:49
特别是线程并不昂贵。我个人做了一个已经运行了500多次的程序。服务器程序可以产生更多的东西。
声音处理并不便宜,但我不知道它比3D中的照明等许多图形效果占用更多的cpu。我制作了一个程序,既播放了声音,又制作了一个“发光球”,在播放声音的过程中,它会变大和变暗。“发光球”不断更新一个RadialGradientPaint来实现这个效果。我遇到了大约10个球和声音的上限,而图形球是更大的处理负载。
尽管如此,在播放17个剪辑的情况下,您可能无法做很多其他的事情。您必须对其进行测试,如果cpu跟不上,就会听到辍学的声音。
您的17个剪辑可能会占用大量的RAM。你知道它们都加载到内存中了,对吧?每秒44100个样本,通常每个样本4个字节(立体声,16位PCM),这开始快速增加。
因此,可能有理由考虑使用SourceDataLine来代替,特别是对于较长的声音。
此外,一些操作系统似乎不能很好地处理多个声音。我在这里遇到了一些问题,特别是Linux。我最终编写了一个程序,将所有播放的声音混合到一个输出SourceDataLine中,作为处理这一问题的一种方法。
我获得一些效率的另一种方法是加载我自己定制的剪辑。我给了这个剪辑多个光标(指针),它们可以独立地在音频数据中移动。这样,我可以多次(以不同的速度)重叠播放一个剪辑。要对Java剪辑执行此操作,必须多次将其加载到RAM中。所以,你可以考虑写一些类似这样的东西。多个游标的输出可以相加,并通过SourceDataLine播放。
https://stackoverflow.com/questions/11456622
复制相似问题