2013-07-01 44 views
0

我正在写一个游戏(-engine),其中我想要有一些音效。我的代码很好地处理了一个wav文件。但是,当我尝试加载mid文件时,花费了大约6秒。这是我的SSCCE:我的机器上加快音乐加载

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,这是不是更快。 这是我的机器的环境:

  • 操作系统:Windows 7旗舰版64位
  • 处理器:Pentium(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.javaSound.txt

当我使用其他游戏引擎打开mid文件,游戏启动瞬间,所以必须有一种方法来加快加载。 我想知道如何加快这样的音乐文件的加载,没有比我的游戏库大。

+0

我不明白这里的逻辑,为什么要复制到内存中的网址?有你尝试过的'ClassLoader.getResourceAsStream()'? –

+0

@BoristheSpider因为我想多次加载音乐(所以我可以同时播放两个相同的声音)。此外,正如我测试,将文件读入内存立即完成。 – johnchen902

回答

1

您正在混合采样音频数据和乐器数字接口数据。
你可以在这里找到澄清和代码用法:Java Sound

+0

太棒了!现在时间可以接受:1.175856692秒。 – johnchen902