나는 게임을 작성 중입니다. (-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.wav 및 music.mid (the slow one)
- 정확한
Sound
클래스는 내가 사용 : Sound.java 또는
나는 mid
파일을 열려면 다른 게임 엔진을 사용 4,284,는, 게임은 즉시 시작, 그래서 로딩을 빠르게 할 수있는 방법이 있어야합니다. 나는 내 게임보다 큰 도서관없이 그러한 음악 파일의 로딩 속도를 높이는 방법을 알고 싶습니다.
여기 논리를 이해하지 못하는 이유는 무엇입니까? 시도한'ClassLoader.getResourceAsStream()'을 가지고 있습니까? –
@BoristheSpider 저는 음악을 두 번 이상로드하려고 했으므로 (동시에 두 개의 동일한 사운드를 재생할 수 있습니다). 게다가 내가 테스트 한 것처럼 파일을 메모리로 읽어 들이면 즉시 완료됩니다. – johnchen902