Ответ: Russian Sound System
Короче удалось более менее настроить - рывков нету, работает довольно плавно 40fps на одном ядре (без звука приложение 45fps дает).
Значит что я сделал:
* Размер вторичного буфера сократил до 100мс, то есть каждые 50мс он догружает новые данные.
* Микшер я сделал так что он обрабатывает данные порционно, например при 60fps (17мс на каждый кадр) блок в 50мс проигрывается в течении 3 кадров. Для блока в 50мс нужно обработать ( 44100 * 2канала / 20 ) семплов и это кол-во делиться на 3 и в каждый кадр вызывается функция микшера которая обрабатывает 1/3 от этого блока, и на третий раз она вызывает запись в буфер устройства.
* Таким образом теперь лучше заточено под вызов обработки микшера в каждом кадре.
На что следует обратить внимание:
* Во первых основная проблема - латентность. Возникает из-за того что микшер находится до самого устройства вывода. То есть мы не можем сначала загрузить звук в буферы, а затем в любое время смикшировать и вывести. И если например в случае музыки всё предсказуемо, то например нельзя наперёд знать когда игрок выстрелит или сделает другое действие требующее звукового сопровождения. С другой стороны создание слишком маленького буфера требует очень частого его обновления и получается что сама пересылка данных и потери в интервалах между вызовами функции обновления (в каждом кадре) занимает больше времени чем проигрывание этого мелкого буфера. Я примерно подобрал оптимальное значение - 100мс. При низком fps (< 30)всё равно начинаются проблемы, но это можно исправить вынеся звук в отдельный поток.
* Второе это собственно многопоточность - как ни крути она должна здесь быть, потому что даже мелкомягкие так рекомендуют делать. Воспроизведение звука в отличии например от вывода графики рассматривается как внешнее действие, а значит должен существовать поток который должен его контролировать (также как это делают для сети или когда хотят сделать нелагающий курсор мыши).
* Третье это собственно скорость микшера. Потому что имхо: раз у нас софтварный микшер значит нам доступен весь объем рамы, а это значит что мы не связаны ограниченным набором звуков которые можно воспроизвести без подгрузки в буфер, и как следствие преимущество должно быть в богатом и разнообразном звуковом сопровождении, но для этого нужен быстрый микшер. Вот.
|