Есть ряд трудностей, с которыми приходится иметь дело.Во-первых, Java не предоставляет гарантий в реальном времени, поэтому момент, когда часть звуковых данных обрабатывается, не обязательно соответствует моменту их прослушивания.Во-вторых, легко запутаться из-за отсутствия детализации системных часов ОС, что, как я предполагаю, способствует тому, что вы видите, как время появляется несколько раз.У нас было много рассказов об этом на java-gaming.org несколько лет назад.[РЕДАКТИРОВАТЬ: теперь я думаю, что ваша проверка зацикливается быстрее, чем степень детализации размера буфера, используемого клипом.]
Единственный способ, который я знаю, чтобы получить действительно точную синхронизацию, - отказаться от использования.Clip
в целом, и вместо этого подсчитывать кадры при выводе на SourceDataLine
.У меня был хороший успех с этим.Это самая последняя точка перед выводом в собственный код рендеринга звука, и поэтому она имеет наилучшие временные характеристики.
При этом может быть возможно реализовать какой-то импульс (например, с помощью утилиты.Timer) через регулярные промежутки времени (соответствующие четвертным или шестнадцатым нотам) и TimerTask запускает воспроизведение Clip
объектов.Я сам не пробовал, но этого может быть достаточно для ритм-игры.Для этого вы бы использовали Clip
объектов, а не SourceDataLine
.Но убедитесь, что каждый Clip
полностью загружен и готов к работе во время воспроизведения.Не делайте типичную ошибку, загружая их заново для каждого воспроизведения.
Но когда я в последний раз пытался сделать что-то подобное, используя обычный игровой цикл, результат был не таким горячим.
JavaFX отлично подходит для написания игр!Я нахожу графику намного проще в обращении, чем AWT.Я написал учебник для начала работы с JavaFX для программирования игр.Это устарело, что касается настройки с Eclipse, если вы используете JavaFX 11. Но если вы используете Java 8, я думаю, что он все еще охватывает основы.
В JGO люди в пареразные лагеря.Многие любят использовать Libgdx, библиотеку, а некоторые из нас продолжают использовать JavaFX или AWT / Swing.Есть еще несколько библиотек, отстаиваемых различными участниками.
JavaFX имеет свой собственный звуковой выход, но я не играл с ним и не знаю, лучше ли это, чем Clip для ритмической точности.Все сигналы играют великолепно, но всегда будет трудно получить полезную информацию о синхронизации из сигналов, учитывая систему непрерывного переключения между потоками в Java.
Просто просматривал содержимое на JGO.Вы можете найти эту тему интересной, где ОП пытался сделать метроном.http://www.java -gaming.org / themes / java-audio-метроном-проблемы со временем и скоростью / 33591 / view.html
[РЕДАКТИРОВАТЬ: PS, я написалнадежный метроном и система воспроизведения событий, достаточно надежная, чтобы связать воедино музыкальное событие в бесшовном ритме, и слушатели, которые могут следить за такими вещами, как огибающие громкости нот, воспроизводимых в режиме реального времени.В конечном итоге это должно быть выполнимо, если вы хотите.]