Как играть звуки в Java-играх? - PullRequest
2 голосов
/ 11 февраля 2010

Я успешно играю звуки в игре апплета Java (1.5), используя следующий код:

// get an available clip to play it
Clip clip = null;
for (Clip clipTemp : players) {
    if (!clipTemp.isOpen()) {
    clip = clipTemp;
        break;
    }
}
if (clip == null) {
    // no available player found, don't play
    return;
}

clip.open(audioFormat, audioByteData, 0, audioByteData.length);

clip.start();

(Игроки - это список клипов, которые я открываю в начале, чтобы уменьшить задержку, слушатель строки закрывает линию при получении события остановки.)

Проблема, с которой я сталкиваюсь, заключается в периодических задержках до 1 секунды при воспроизведении звука. Это очень плохо.

Есть ли способ улучшить это? SourceDataLines стоит рассмотреть?

Ответы [ 2 ]

2 голосов
/ 12 февраля 2010

Java-апплет транслирует ваш клип всякий раз, когда вы хотите его воспроизвести, поэтому вы получаете задержку, поскольку звуковой файл еще не был загружен в память.

Прошло некоторое время с тех пор, как я занимался программированием Java-апплета, но я помню, что раньше я загружал все свои клипы, и тогда последующие вызовы для воспроизведения не открывали файлы заново.

Вот код из одного из моих старых проектов

Clip shoot;

private loadShootWav()
{
    AudioInputStream sample;
    sample = AudioSystem.getAudioInputStream(this.getClass().getResource("shoot.wav"));
    shoot = AudioSystem.getClip();
    shoot.open(sample);
}

public void playShootSFX()
{
    shoot.stop();
    shoot.setFramePosition(0);
    shoot.start(); 
}
0 голосов
/ 20 августа 2011

Если я правильно читаю ваш код, вы находите неоткрытый клип и открываете его перед воспроизведением.Было бы быстрее взять открытые клипы и перезапустить их.Возможно, вам придется сначала остановить и сбросить их позиции, как показано JSmyth в примере playShootSFX ().

Я получаю довольно хороший ответ с SourceDataLines.Приятно то, что они запускаются быстрее, чем неоткрытый клип, поскольку они запускаются сразу, вместо того, чтобы ждать, пока ВСЕ данные для звука будут загружены в ОЗУ (что происходит каждый раз, когда вы «открываете» клип).* Но, да, если у вас много маленьких звуков, которые часто воспроизводятся, лучше всего использовать пул клипов.Если вы хотите, чтобы они перекрывались или всегда воспроизводились до конца, вам нужно несколько копий.Если нет, то остановитесь, сбросьте на 0 и перезапустите.Но не продолжайте открывать!Если вы делаете это, вы также можете использовать SourceDataLine.

...