2013-07-01 2 views
0

나는 게임을 작성 중입니다. (-engine), 약간의 효과음을 갖고 싶습니다. 내 코드는 wav 파일을 잘 처리합니다. 그러나 mid 파일을로드하려고하면 약 6 초가 걸립니다. 내 컴퓨터에음악 로딩 속도를 높이십시오.

import java.io.*; 
import java.net.URL; 
import javax.sound.sampled.*; 

public class Sound { 

    private ByteArrayInputStream bais; 

    public Sound(URL u) throws Exception { 
     bais = readAll(u); 
     createClip(); // XXX too slow 
    } 

    private Clip createClip() throws Exception { 
     bais.reset(); 
     AudioInputStream audioInputStream = AudioSystem 
       .getAudioInputStream(bais); 
     Clip clip = AudioSystem.getClip(); 
     clip.open(audioInputStream); // XXX too slow 
     audioInputStream.close(); 
     return clip; 
    } 

    public static ByteArrayInputStream readAll(URL u) throws IOException { 
     InputStream is = u.openStream(); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     byte[] bytes = new byte[4096]; 
     for (int len; (len = is.read(bytes)) > 0;) 
      baos.write(bytes, 0, len); 
     is.close(); 
     return new ByteArrayInputStream(baos.toByteArray()); 
    } 

    public static void main(String[] args) throws Exception { 
     { 
      long start = System.nanoTime(); 
      new Sound(Sound.class.getResource("click.wav")); // fast enough 
      long end = System.nanoTime(); 
      System.out.println("Time: " + (end - start)/1e9 + " seconds"); 
     } 
     { 
      long start = System.nanoTime(); 
      new Sound(Sound.class.getResource("music.mid")); // XXX too slow 
      long end = System.nanoTime(); 
      System.out.println("Time: " + (end - start)/1e9 + " seconds"); 
     } 
    } 
} 

출력 :

Time: 0.295358713 seconds 
Time: 5.695282061 seconds 

이 또한 내가 Applet.newAudioClip을 시도했다, 빠르지이 내 SSCCE입니다. 그리고 이것은 내 컴퓨터의 환경 :

  • OS : 윈도우 7 얼티밋 64 비트
  • 프로세서 : 펜티엄 (R) 듀얼 코어 CPU를 E6300 @의 2.80GHz의의 2.53GHz로
  • 설치된 메모리 (RAM) : 2.00GB
  • 내가 사용
  • java version "1.7.0_17" 
    Java(TM) SE Runtime Environment (build 1.7.0_17-b02) 
    Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode) 
    
  • 정확한 음악 파일 : click.wavmusic.mid (the slow one)
  • 정확한 Sound 클래스는 내가 사용 : Sound.java 또는

나는 mid 파일을 열려면 다른 게임 엔진을 사용 4,284,는, 게임은 즉시 시작, 그래서 로딩을 빠르게 할 수있는 방법이 있어야합니다. 나는 내 게임보다 큰 도서관없이 그러한 음악 파일의 로딩 속도를 높이는 방법을 알고 싶습니다.

+0

여기 논리를 이해하지 못하는 이유는 무엇입니까? 시도한'ClassLoader.getResourceAsStream()'을 가지고 있습니까? –

+0

@BoristheSpider 저는 음악을 두 번 이상로드하려고 했으므로 (동시에 두 개의 동일한 사운드를 재생할 수 있습니다). 게다가 내가 테스트 한 것처럼 파일을 메모리로 읽어 들이면 즉시 완료됩니다. – johnchen902

답변

1

샘플링 된 오디오 데이터와 악기 디지털 인터페이스 데이터를 혼합합니다.
여기서 설명과 코드 사용법을 찾을 수 있습니다. Java Sound

+0

좋아요! 이제 시간은 받아 들일 수 있습니다 : 1.175856692 초. – johnchen902

관련 문제