문제

은 Java 적절한 대안을 C/C++에 대한 실시간 처리?

나는 고려와 응용 프로그램~100(최대)의 트랙으로 오디오를 지연선(30@48khz),필터링(512 점 FIR?), 과 다른 유형 DSP 작업에서 발생하는 각 트랙 동시에.

Operations 변환 될 것이며 수행에 뜨는 점이다.

시스템 것 쿼드 중핵 3GHz4GB RAM,실행하는 명령.

본 기사에 대해 자바되는 것보다 훨씬 빠르게 사용하고,close to C/C++,이제는 실시간 확장니다.이것이 현실로?그것은 필요한 하드 코어 코딩 및 조정하여 달성하%의 50%100 성능의 C 부 spec'ing?

나는 진짜로 감각을 찾으면 이것이 가능한 모든 개는.

도움이 되었습니까?

해결책

오디오 애플리케이션의 경우 대부분의 시간이 소비되는 코드의 작은 부분 만 있습니다.

Java에서는 언제든지 JNI (Java Native Interface)를 사용하고 계산 헤비 코드를 C 모듈 (또는 실제로 전원이 필요한 경우 SSE를 사용하는 어셈블리)으로 이동할 수 있습니다. 그래서 Java를 사용하고 코드가 작동한다고 말하고 싶습니다. 성능 목표를 달성하지 못한다면 JNI를 사용하십시오.

코드의 90%는 어쨌든 접착제 코드 및 응용 프로그램 일 가능성이 높습니다. 그러나 크로스 플랫폼 기능의 일부를 그런 식으로 느슨하게한다는 점을 명심하십시오. 당신이 그와 함께 살 수 있다면 JNI는 항상 당신에게 기본 코드 성능을 위해 문을 열어줍니다.

다른 팁

Java는 많은 오디오 응용 프로그램에 적합합니다. 다른 포스터와는 달리, 나는 Java Audio가 함께 일할 기쁨을 느낍니다. Coreaudio 인 끔찍하고 간신히 문서화 된 Mindf*K와 귀하가 이용할 수있는 API와 리소스를 비교하면 신자가 될 것입니다. Java Audio는 일부 대기 시간 문제로 어려움을 겪지 만 많은 앱의 경우 관련이 없으며 코덱이 부족합니다. 또한 좋은 오디오 재생 엔진을 작성하기 위해 시간을내어 귀찮게하지 않은 사람들도 많이 있습니다 (힌트, 소스를 닫지 말고, 대신 0을 써주는지), 그에 대한 Java는 문제에 대해 Java를 비난합니다. API 관점에서 Java Audio는 매우 간단하고 사용하기 쉽고 AT에 대한 많은 지침이 있습니다. jsresources.org.

물론, 왜 안돼?

중요한 질문 (언어와 독립적으로, 이것은 대기열 이론)입니다.

  • 처리 해야하는 최대 처리량은 얼마입니까 (100 x 48kHz를 지정했는데, 해당 주파수에 동등한 비트가 몇 개 인 모노 또는 스테레오입니까?)
  • Java 루틴이 평균적 으로이 요금을 따라 잡을 수 있습니까?
  • 최대 허용 대기 시간은 얼마입니까?

프로그램이 평균적으로 처리량을 따라 잡을 수 있고 대기 시간에 충분한 공간이 있다면 입력 및 출력에 대기열을 사용할 수 있어야하며 타이밍에 중요한 프로그램의 유일한 부분은 조각입니다. 데이터를 입력 큐에 넣고 출력 대기열에서 꺼내어 DAC/Speaker/무엇이든 보내십시오.

지연 라인은 계산 부하가 낮으므로 충분한 메모리 (+ 메모리 대역폭) 만 필요합니다. 실제로 입력/출력 대기열을 사용해야 할 것입니다. 즉, 즉시 입력 큐에 데이터를 넣기 시작하고 데이터를 끄기 시작해야합니다. 출력 대기열 30 초 후. 거기에 없다면 프로그램이 너무 느립니다 ...).

전나무는 더 비싸다. 아마도 다른 못생긴 불쾌한 작업을 염두에 두지 않는 한 병목 현상 (및 최적화하고 싶은 것) 일 것입니다.

대기 시간이 주요 문제라고 생각합니다. 현대 OS에서 C/C ++에서 이미 대기 시간을 유지하기가 어렵고 Java는 반드시 문제 (쓰레기 수집기)를 추가합니다. "실시간"오디오 처리의 일반적인 디자인은 처리 스레드를 실시간 스케줄링 (Linux 커널의 Sched_Fifo, 다른 OS에서 해당)으로 실행하는 것입니다. 이것은 시스템 호출, malloc, 물론 IO 등이 없음을 의미합니다 ... 페이징조차도 문제가됩니다 (디스크에서 메모리로의 페이지를 얻는 것은 여러 ms를 쉽게 가져갈 수 있습니다). 교환.

Java에서 그런 일을 할 수는 있지만 Java는 더 복잡하고 쉽지 않습니다. 나는 코어가 C에 있고 나머지 (Gui 등)가 원한다면 자바에있을 수있는 혼합 디자인을 조사 할 것이다.

내가 당신의 질문에서 보지 못한 한 가지는 처리 된 샘플을 재생 해야하는지 아니면 다른 일을하고 있는지 (예 : 파일로 인코딩)입니다. 나는 JVM이 샘플을 세척 할 수있는 것보다 Java의 사운드 엔진 상태에 대해 더 걱정할 것입니다.

나는 javax.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound.sound. 강함). javax.sound.sampled는 샘플을 알 수없는 지속 시간의 불투명 버퍼로 밀어야하므로 동기화가 불가능합니다. 또한 문서화되지 않았다 (메모리 내 클립의 사소한 예제와 달리 줄을 통해 불확실한 길이의 오디오를 스트리밍하는 예)는 구현되지 않은 방법 (Dataline.getLevel () ... 비 구현이 아닌 사람 '' T조차 문서화), 그리고 그것을 끝내기 위해, 나는 Sun이 몇 년 전에 마지막 Javasound 엔지니어를 해제했다고 생각합니다.

만약 내가 가졌다 사운드 믹싱 및 출력을 위해 Java 엔진을 사용하기 위해서는 최소한 엔진이 현재 지원되고 매우 낮을 수 있다는 것을 알고 있기 때문에 Openal에 Joal 바인딩을 첫 번째 선택으로 사용하려고 노력할 것입니다. 장기적으로 NILS가 정확하다고 생각하지만 JNI를 사용하여 Native Sound API를 호출하게됩니다.

Yes,Java 한 오디오 응용 프로그램.당신이 사용할 수 있습 Java 및 액세 오디오 레이어를 통해 Asio 고 정말 낮은 대기 시간(64samples 대기 시간이있는 아무것도)에 윈도우 플랫폼입니다.그것은 당신이 의미가 있을 것이 lip-sync 에 비디오/영화입니다.더 많은 대기에서 맥 없으므로 Asio 을"바로 가기를"의 조합 OS X 와"자바 상단에"하지만,아직 확인.Linux 또한,하지만 나는 더욱 무지입니다.보 soundpimp.com 를 위한 실용적인(고 세계에 첫 번째)의 예 Java 및 Asio 작업에서 완벽한 조화를 이룹니다.또한 NRK 라디오 및 tv 안드로이드 앱이 포함된 sw mp3 디코더(Java).당신이 할 수 있는 대부분의 오디오 것으로 Java,다음 사용하어하는 경우 추가 시간이 중요합니다.

JSYN이라는 라이브러리를 확인하십시오.

http://www.softsynth.com/jsyn/

하루를 보내고 최소한의 처리를 수행하는 간단한 Java 애플리케이션을 작성하고 성능이 adaquate인지 확인하십시오.

에서 http://www.jsresources.org/faq_performance.html#java_slow

이더날의 지혜를 수집합시다.

  • 지구는 평평합니다.

  • 그리고 잊지 말고 : Java는 느립니다.

여러 응용 프로그램에서 증명 된 바와 같이 (링크 섹션 참조) Java는 오디오 편집기, 멀티 트랙 레코딩 시스템 및 MIDI 프로세싱 소프트웨어를 구축하기에 충분합니다. 시도해보십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top