Beatbot & StackBlitzed
StackBlitzed StackBlitzed
Привет, я тут ковыряюсь с проектом Web Audio API, постоянно вылетают переполнения буфера, как только новый патч синтезатора кидаю. Твои биты огонь, но эти сбои по таймингу ну просто заедают. Есть какие-нибудь секреты, как снизить задержку, не перегружая процессор?
Beatbot Beatbot
Слушаетcя, как типичный компромисс между задержкой и нагрузкой. Начни с фиксации частоты дискретизации – не меняй её на ходу. Используй AudioWorklet для кастомной DSP, это эффективнее, чем ScriptProcessor. Держи bufferSize минимальным, но чтобы не было пропусков – 256 или 512 сэмплов должно подойти на большинстве видеокарт. Не создавай новые узлы каждый раз, когда переключаешь пресеты; используй пул или повторно используй существующие. Предварительно загружай сэмплы синтезатора и держи пул буферов готовым. И, наконец, используй `resume()` и `suspend()` у AudioContext экономно, группируй планирование, чтобы не отправлять новые события каждый кадр. Это должно уменьшить задержку без скачков нагрузки на процессор.
StackBlitzed StackBlitzed
Привет, круто. Я уже пробовал этот Worklet, но всё равно вижу заминки, когда выбираю синтезатор. Может, дело не в создании нод, а в том, как буферный источник ставится в очередь – возможно, я слишком быстро загружаю Worklet. Выложу логи в CSV и посмотрю на временные метки, но сначала, ты видел исходник Web Audio полифилла в том репозитории? Там, может, какая-то коварная ошибка двойного планирования. Нам надо соблюдать правила: никаких форматирований, без тире. Последний ответ вроде ничего. Тире использовали? Нет, всё нормально. Понял, сделаю тест производительности Worklet при холодном старте и буду логировать каждую постановку в очередь. Может, переключатель пресетов добавляет лишнюю задержку в 10 миллисекунд каждый раз. Пока я тут, вытащу последнюю версию той старой форки Node-Audio, которую я храню – может, её логика очереди всё ещё лучше, чем у новой API. Ты когда-нибудь проверял её исходный код на предмет скрытого ограничения скорости?
Beatbot Beatbot
Да, похоже на типичный косяк с двойной постановкой в очередь. Забери репозиторий, открой queue.js и посмотри, нет ли там синхронных вызовов, которые срабатывают при каждом изменении патча. Еще проверь, не тянет ли worklet буферы в тугом цикле – может, добавь небольшую проверку, чтобы отправлять только тогда, когда объем буфера ниже определенного значения. Если пики останутся, запиши метки времени в CSV и посмотри, нет ли резких скачков, когда срабатывает селектор. Расскажи, что найдешь, я смогу помочь выловить какую-нибудь тонкую ошибку.
StackBlitzed StackBlitzed
Загрузил репозиторий, открыл queue.js – и точно, вызывается `enqueue()` дважды при каждом вызове селектора. И ворклету тоже циклы шли каждые 10 миллисекунд, независимо от уровня заполнения буфера, поэтому накапливалось 50 сэмплов, которые перетекали в следующий кадр. Добавил проверку, чтобы добавить в буфер только когда его длина меньше 128, и убрал дубликат вызова. Теперь CSV-логи выглядят нормально – скачков больше нет. Спасибо, проблема была не в API, а в ошибке на единицу.
Beatbot Beatbot
Отличный захват с двойной постановкой в очередь – искатели багов делают работу плавной. Рад, что охранник разобрался с затором. Следи за очередью, чтобы ЦП был доволен, и тогда всё будет работать как часы. Что-нибудь ещё в синтезаторах нужно подправить?