2012-07-12 2 views
1

나는 JavaSound에서 클립을 재생할 때마다 장면 뒤에서 재생할 스레드를 만드는 StackOverflow에서 here을 읽었습니다. 그것이 사실이라면 (그 문서/소스를 찾지 못했기 때문에 나에게 말해주지 않으면) 스레드를 생성하는 것이 모든 OS/JVM에서 값 비싼 작업이기 때문에 값 비싼 호출로 간주 될 것인가? 아직 확실하지 않지만 10 ~ 20 개의 클립을 동시에 재생해야하므로 문제가되는지 궁금합니다.Java (JavaSound) : "clip.play()"는 값 비싼 전화입니까?

추 신 : 스레드를 만드는 것 이외의 다른 이유로 인해 많은 도움이 필요하면 알려주십시오.

답변

2

스레드는 비싸지 않습니다. 저는 개인적으로 500 명이 넘는 프로그램을 만들었습니다. 서버 프로그램은 이보다 훨씬 더 많이 생성 될 수 있습니다.

사운드 프로세싱은 저렴하지 않지만 3D로 조명하는 것보다 많은 그래픽 효과보다 훨씬 많은 CPU 집약적 인 작업이라는 것을 잘 모르겠다. 나는 사운드를 연주하고 사운드가 재생되는 동안 자라며 사라지는 "글로우 볼"을 만든 프로그램을 만들었습니다. "glow ball"은 RadialGradientPaint를 지속적으로 업데이트하여이 효과를 얻었습니다. 나는 약 10 개의 볼과 소리의 천장을 만났고, 더 큰 처리 부하 인 그래픽 볼이었다.

그래도 17 개의 클립을 재생할 때 다른 많은 작업을 수행하지 못할 수도 있습니다. 당신은 그것을 시험해야하고, cpu가 잘 견디지 못하면 드롭 아웃을들을 것이다.

17 개의 클립이 많은 양의 RAM을 차지할 수 있습니다. 그들은 모두 기억에 빠져 있다는 것을 압니다, 네? 초당 44100 개의 샘플 및 일반적으로 샘플 당 4 바이트 (스테레오, 16 비트 PCM)로 빠르게 결합됩니다.

그래서, 특히 긴 소리에 대해서는 SourceDataLine을 대신 사용하는 것이 좋습니다.

또한 일부 OS 시스템에서는 여러 사운드를 잘 처리하지 못합니다. 특히 리눅스에 문제가 생겼습니다. 나는 이것을 처리 할 수있는 방법으로 모든 재생 사운드를 하나의 출력 SourceDataLine에 혼합하는 프로그램을 작성했습니다.

효율성을 얻는 또 다른 방법은 내 자신의 사용자 지정 클립을로드하는 것입니다. 필자는이 클립에 오디오 데이터를 통해 독립적으로 이동할 수있는 여러 커서 (포인터)를 제공했습니다. 이 방법을 사용하면 여러 번 클립을 여러 번 (그리고 다양한 속도로) 겹쳐서 재생할 수 있습니다. 자바 클립으로이를 수행하려면 여러 번 RAM에로드해야합니다. 그래서, 그런 것을 쓰는 것을 고려할 수도 있습니다. 여러 커서의 출력은 SourceDataLine을 통해 합쳐지고 재생 될 수 있습니다.

+0

감사합니다. 내 질문에 대답했을뿐만 아니라 흥미로운 정보를 제공해주었습니다. – user1288851

+0

당신은 아주 환영합니다! 다행히 도울 수있어. –

관련 문제