Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中使用AudioClip会严重冻结程序吗?_Java_Audio - Fatal编程技术网

在Java中使用AudioClip会严重冻结程序吗?

在Java中使用AudioClip会严重冻结程序吗?,java,audio,Java,Audio,我没有任何代码来显示链接,因为这是一个相当普遍的问题…你看,我制作了一个带有8个音频剪辑变量的小游戏小程序,这些小程序应该在用户每次执行某个操作时播放。例:玩家点击=射击声音播放。问题是,在我添加这些音频剪辑文件的那一刻,我的程序就严重冻结,如果冻结情况特别糟糕,程序将无法运行 我做这件事的简单方法就是在这里(实际上是从书中) 然后,每当用户单击时,我都会使用以下命令: playerShooting.play(): 在添加这些wav文件之前,我的程序运行顺利。它们甚至没有那么长。我在这里哪里

我没有任何代码来显示链接,因为这是一个相当普遍的问题…你看,我制作了一个带有8个音频剪辑变量的小游戏小程序,这些小程序应该在用户每次执行某个操作时播放。例:玩家点击=射击声音播放。问题是,在我添加这些音频剪辑文件的那一刻,我的程序就严重冻结,如果冻结情况特别糟糕,程序将无法运行

我做这件事的简单方法就是在这里(实际上是从书中)

然后,每当用户单击时,我都会使用以下命令:

playerShooting.play(): 
在添加这些wav文件之前,我的程序运行顺利。它们甚至没有那么长。我在这里哪里出了问题,我怎样才能消除随机冻结

编辑:

这是我正在运行的代码:

public void mouseClicked(MouseEvent e)
                {
                    if(playerAlive)
                    {
                        timeShotsAfter=System.currentTimeMillis();

                        if((timeShotsAfter-timeShotsBefore)>=100)
                        {
                            if(shotIndex<10)
                            {
                                playerShooting(); //Here is where I call the function
                                shotFiredX[shotIndex]=currentX;
                                shotFiredY[shotIndex]=currentY;
                                shotSize[shotIndex]=20;
                            }

                            if(shotIndex<10)
                                shotIndex++;
                            else
                                shotIndex=0;

                            timeShotsBefore=System.currentTimeMillis();
                        }
                        else{}

                        toggleShooting=false;
                    }
                }

在另一个线程中播放音频剪辑? 编辑:

编辑:

我不太确定这部分是否正确:

getAudioClip(getDocumentBase(),“PlayerShooting.wav”)


尝试添加
System.out.println(getDocumentBase())
查看位置是否正确。

我前一段时间也遇到了同样的问题。我解决问题的方法是更新到JDK 8。在以前的JDK版本中,音频文件似乎是事后才想到的,可能有缺陷。如果您仍然有问题,JDK 8可以播放比wav小得多的mp3文件(您可能想试试这个)。确保剪辑完成后使用
sound.stop()
,因为这可能会释放一些内存。

我不熟悉线程,但你的意思是我应该用你的代码替换“playerShooting.play();”?他想调用线程中的play()方法(即代替//play AUDIO code注释)。@user3436981检查编辑。这样,每当用户单击一个单独的线程时,就会创建一个单独的线程来播放声音,并且运行应用程序的主线程不会被阻止。是的,我刚刚更新了我的程序,我所做的是,当用户单击时,我运行了一个包含你的代码的函数。这就是我应该做的吗?我刚试过,但还是死机了。@user3436981请在您的问题中输入一些代码。
public void mouseClicked(MouseEvent e)
                {
                    if(playerAlive)
                    {
                        timeShotsAfter=System.currentTimeMillis();

                        if((timeShotsAfter-timeShotsBefore)>=100)
                        {
                            if(shotIndex<10)
                            {
                                playerShooting(); //Here is where I call the function
                                shotFiredX[shotIndex]=currentX;
                                shotFiredY[shotIndex]=currentY;
                                shotSize[shotIndex]=20;
                            }

                            if(shotIndex<10)
                                shotIndex++;
                            else
                                shotIndex=0;

                            timeShotsBefore=System.currentTimeMillis();
                        }
                        else{}

                        toggleShooting=false;
                    }
                }
public void playerShooting()
        {
            new Thread(
            new Runnable() {
                public void run() {
                    try {
                        playerShooting.play();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
new Thread(
            new Runnable() {
                public void run() {
                    try {
                        playerShooting.play(): 
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();