Java(JavaSound):“clip.play()”是一个昂贵的电话吗?

时间:2012-07-12 16:44:09

标签: java multithreading performance jvm javasound

我在StackOverflow上读过here每次你在JavaSound中播放一个片段时,它会在幕后创建一个播放它的线程。如果它是真的(如果不是,请告诉我,因为我没有找到任何文档/来源),它会被认为是一个昂贵的调用,因为在任何OS / JVM中创建线程是一项昂贵的任务吗?我还不确定,但我可能需要同时播放10到20个剪辑,所以我想知道这是不是一个问题。

PS:如果在创建线程时出于其他原因这是一个exoensive,请告诉我。

1 个答案:

答案 0 :(得分:2)

线程并不昂贵,尤其如此。我亲自制作了一个有500多个跑步的程序。服务器程序可以产生比这更多的东西。

声音处理并不便宜,但我不知道它比许多图形效果(如3D照明)更加cpu密集。我制作了一个程序,它既发出了声音又制作了一个“发光球”,当声音播放时,它变得越来越褪色。 “辉光球”不断更新RadialGradientPaint以实现此效果。我遇到了大约10个球和声音的天花板,这是图形球,处理负荷更大。

尽管如此,你可能无法在17场比赛中做很多其他事情。你必须测试它,并且如果cpu无法跟上,你会听到辍学。

你的17个剪辑可能占用大量的RAM。你知道它们都装进了内存,是吗?每秒44100个样本,通常每个样本4个字节(立体声,16位PCM),开始快速加起来。

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

此外,似乎某些操作系统不能很好地处理多个声音。特别是在Linux上我遇到了问题。我最后编写了一个程序,将所有播放的声音混合到一个输出SourceDataLine中作为处理它的方法。

我获得一些效率的另一种方式是我加载自己定制的Clip。我给这个Clip多个游标(指针)可以独立地移动音频数据。这样,我可以多次(并且以不同的速度)重叠播放Clip。要使用Java Clip执行此操作,必须多次将其加载到RAM中。所以,你可以考虑写一些类似的东西。多个游标的输出可以通过SourceDataLine求和并播放。